如何禁用AlertDialog内的按钮?跟进问题

时间:2011-09-13 13:53:03

标签: android

我昨天问了这个问题(http://stackoverflow.com/questions/7392321/how-do-you-disable-a-button-inside-of-an-alertdialog)并相应地修改了我的代码......这个早上我在模拟器中运行代码并收到了NPE。这是代码:

public void monster() {
        int playerint = settings.getPlayerInt();
        int monsterint = settings.getMonsterInt();



        AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
        alertbox.setMessage("You have Encountered a Monster");

        alertbox.setPositiveButton("Fight!",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
                        createMonster();
                        fight();

                    }
                });

        alertbox.setNeutralButton("Try to Outwit",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
                        // This should not be static
//                      createTrivia();
                        trivia();

                    }
                });

        // Return to Last Saved CheckPoint
        alertbox.setNegativeButton("Run Away!",
                new DialogInterface.OnClickListener() {

                    // do something when the button is clicked
                    public void onClick(DialogInterface arg0, int arg1) {
//                      runAway();
                    }
                });

这就是问题出现的地方

// show the alert box
            alertbox.show();
            AlertDialog dialog = alertbox.create();
            Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
            if(monsterint > playerint) {
                button.setEnabled(false);
            }
        }

任何人都知道我做错了什么?

4 个答案:

答案 0 :(得分:10)

你有两个问题。首先,您应该像这样单独调用show()create()。你实际做的是隐式创建一个AlertDialog并用alertbox.show()显示它,然后在它下面创建一个你用来操作按钮的AlertDialog。让我们尽量保持对Builder的直接调用。

此外,更直接的原因导致您的NPE崩溃,在AlertDialog之内,按钮本身在AlertDialog准备显示之前实际上并未创建(基本上,{{1}之后再次调用...,不要与AlertDialog.show()方法混淆。为了您的目的使用AlertDialog.Builder.show(),您需要在显示对话框后获取并操作按钮状态。以下是对最终代码部分的修改,修复了此问题:

AlertDialog

HTH

答案 1 :(得分:2)

修改

起初我认为代码应该是:

        AlertDialog dialog = alertbox.create();
        Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
        if(monsterint > playerint) {
            button.setEnabled(false);
        }

        dialog.show();

我希望这可行,但无论你如何烹饪这段代码,对getButton(int which)的调用总是返回null。

似乎没有任何明智的理由。我很想说这是API中的一个错误。我将其定位为API级别8。

<强>更新

恭喜您发现Android Bug #6360有关解决方法的评论#4

您还可以查看可能的indirect duplicate of this question

解决方法是在dialog.show()之后调用getButton:

        AlertDialog dialog = alertbox.create();

        dialog.show();

        Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
        if(monsterint > playerint) {
            button.setEnabled(false);
        }

答案 2 :(得分:2)

诀窍是您需要使用AlertDialog方法重新调整的AlertDialog.Builder.show()对象。无需致电AlertDialog.Builder.create()

示例:

        AlertDialog dialog = alertbox.show();
        if(monsterint > playerint) {
            Button button = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
            button.setEnabled(false);
        }

答案 3 :(得分:-1)

我尝试了这些代码,它的工作原理你需要隐藏第一个显示确定

AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
        alertbox.setMessage("You have Encountered a Monster");
        alertbox.setPositiveButton("asdasd", null);

        alertbox.show();
        alertbox.setPositiveButton("", null);
        alertbox.show();