我昨天问了这个问题(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);
}
}
任何人都知道我做错了什么?
答案 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();