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 并且它不起作用。你们能提出一些解决方案吗?

日志猫:

07-13 08:01:14.378: D/ViewRootImpl(19779): ViewRoot TouchDown(Absolute) 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(Native Method)

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): at dalvik.system.NativeStart.main(Native Method)

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 回答
1

这是因为调用时该按钮不存在deleteButton.setEnabled(false)。你应该把电话移到noteAlert.show()前面deleteButton.setEnabled(false)

于 2018-04-06T14:05:23.843 回答
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 回答
0

之后访问按钮dialog.show。否则它将是null

AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
                builder.setTitle("Title");
                builder.setMessage("message");
                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //Do Something
                    }
                });
 builder.setNegativeButton(context.getResources().getString(R.string.no_text), (dialog, which) -> {
                            dialog.cancel();
                            listener.onNoButtonClick();
                        });
                AlertDialog dialog = builder.create();
                dialog.show();
               dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);   
于 2019-01-03T07:25:42.540 回答