1

私は次のように設定しましたAlertDialog

AlertDialog.Builder noteAlert = new AlertDialog.Builder(ClassName.this);
noteAlert.setTitle("Title");
noteAlert.setMessage("Message");
noteAlert.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});
noteAlert.setNeutralButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});
noteAlert.setNegativeButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});

AlertDialog alertDialog = noteAlert.create();                                   
Button deleteButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
if (someCondition != 1)
    // code runs till here
    deleteButton.setEnabled(false); // code works on deleting this line

noteAlert.show();

if上記のコードを実行すると、ステートメントまで機能します。その後、アプリがクラッシュします ( getButton()NPE がスローされると想定しています)。ボタンを無効にするソリューションと同じコードを提供するSOに関する他の多くの回答を見てきました。

行をコメントアウトするsetEnabled()と、アプリは正常に動作します(ボタンのみが無効になりません)。したがって、基本的にこの NegativeButton を無効にしようとしていますが、機能していません。解決策を提案できますか?

LogCat:

07-13 08:01:14.378: D/ViewRootImpl(19779): ViewRoot TouchDown(絶対) DOWN (380 , 691)

07-13 08:01:14.495: E/dialog(19779): AlertDiablog 開始

07-13 08:01:14.495: E/hasnote(19779): 0

07-13 08:01:14.511: E/hasnote(19779): 0

07-13 08:01:14.511: D/AndroidRuntime(19779): VM のシャットダウン

07-13 08:01:14.511: W/dalvikvm (19779): threadid=1: キャッチされない例外で終了するスレッド (group=0x40e392a0)

07-13 08:01:14.519: E/AndroidRuntime(19779): 致命的な例外: メイン

07-13 08:01:14.519: E/AndroidRuntime (19779): java.lang.NullPointerException

07-13 08:01:14.519: E/AndroidRuntime(19779): com.example.sherlockcaldroid2.TestSubjectCalendar$1$2.onClick(TestSubjectCalendar.java:250) で

07-13 08:01:14.519: E/AndroidRuntime(19779): com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:1 66) で

07-13 08:01:14.519: E/AndroidRuntime(19779): android.os.Handler.dispatchMessage(Handler.java:99) で

07-13 08:01:14.519: E/AndroidRuntime(19779): android.os.Looper.loop(Looper.java:137)

07-13 08:01:14.519: E/AndroidRuntime (19779): android.app.ActivityThread.main (ActivityThread.java:4849) で

07-13 08:01:14.519: E/AndroidRuntime(19779): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で

07-13 08:01:14.519: E/AndroidRuntime(19779): java.lang.reflect.Method.invoke(Method.java:511) で

07-13 08:01:14.519: E/AndroidRuntime (19779): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:795) で

07-13 08:01:14.519: E/AndroidRuntime (19779): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:562) で

07-13 08:01:14.519: E/AndroidRuntime(19779): dalvik.system.NativeStart.main(ネイティブ メソッド) で

07-13 08:01:34.089: I/Process(19779): シグナルを送信しています。PID: 19779 SIG: 9

4

4 に答える 4

1

ライフサイクルの後半まで(つまり、show()を呼び出すまで)ビューが膨張しないと確信しています。

ドキュメントをざっと見てみると、build() または inflate() メソッドが見つかりませんでしたが、ボタン操作ロジックの前に noteAlert.show() を移動するのが最も簡単な方法だと思います。

編集:変更しようとしましたか:

noteAlert.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});

noteAlert.setButton(DialogInterface.BUTTON_POSITIVE, "Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});
于 2013-07-13T02:39:33.923 に答える
0

この解決策を試してください:

AlertDialog.Builder noteAlert = new AlertDialog.Builder(ClassName.this); 
noteAlert.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // some code
    }
});
noteAlert.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                if(**some condition**)
                {
                    Button button = builder.getButton(AlertDialog.BUTTON_POSITIVE);
                    if (button != null) {
                        button.setEnabled(false);
                    }
                }
            }
        });
于 2013-11-04T10:49:25.857 に答える