Android AlertDialog getButton()方法返回null

Android AlertDialog getButton()方法返回null,android,android-alertdialog,Android,Android Alertdialog,我已经设置了一个警报对话框,如下所示: AlertDialog.Builder noteAlert = new AlertDialog.Builder(ClassName.this); noteAlert.setTitle("Title"); noteAlert.setMessage("Message"); noteAlert.setPositiveButton("Positive", new DialogInterface.OnClickListener() { public void

我已经设置了一个
警报对话框
,如下所示:

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()
行时,应用程序工作正常(只有按钮未禁用)。所以基本上我试图禁用这个否定按钮,但它不起作用。你们能提出一些解决方案吗

日志:

07-13 08:01:14.378:D/ViewRootImpl(19779):ViewRoot着陆(绝对)着陆(380691)

07-13 08:01:14.495:E/dialog(19779):AlertDialog开始

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):关闭虚拟机

07-13 08:01:14.511:W/dalvikvm(19779):threadid=1:线程以未捕获异常退出 (组=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):在 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):在 main(ActivityThread.java:4849)

07-13 08:01:14.519:E/AndroidRuntime(19779):在 java.lang.reflect.Method.Invokenactive(本机方法)

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/进程(19779):发送信号。PID:19779信号:9


我很确定视图在生命周期的后期(即调用show()时)才会膨胀

我快速查看了文档,找不到build()或inflate()方法,但我认为最简单的方法就是在按钮操作逻辑之前移动noteAlert.show()

编辑: 您是否尝试更改:

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

尝试以下解决方案:

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);
                    }
                }
            }
        });

这是因为调用时按钮不存在
deleteButton.setEnabled(false)
。您应该将调用
noteAlert.show()
移动到
deleteButton.setEnabled(false)
之前,然后访问
对话框后的按钮。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);   

你能发布logcat说的吗?@Razgriz我已经添加了logcat。你是否尝试更改使用setButton()/setButton方法?看,java.lang.CharSequence,android.content.DialogInterface.OnClickListener)我已经设置了按钮(setNegativeButton()等),如果这是你的意思的话。编辑了答案哪个示例
noteAlert
没有
setButton()
函数,所以我将代码中的
noteAlert
改为
alertDialog
。但在对话框出现之前,应用程序就崩溃了。
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);