我正在尝试使用侦听器创建一个EditText,以检查输入文本的长度。如果EditText不为空,则应启用该按钮,否则必须禁用该按钮。为此,我写了这段代码。
final EditText editText = new EditText(context);
builder.setView(editText);
builder.setTitle("TItle");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
}
});
builder.setNegativeButton("No", null);
editText.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
AlertDialog dialog = builder.create();
dialog.show();
String text = editText.getText().toString();
if(text.trim().length()>0) {
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
else {
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
在这里使用NullPointerException在EditText崩溃中写一些东西:button.setEnabled(false);
为什么呢?我怎么解决?
答案 0 :(得分:2)
<强>更新强>
似乎dialogo.getButton()
正在返回null
。我查了一下,有一个similar issue相关。
在致电dialogo.show()
之前,您基本上需要getButton()
。因此,请将代码更新为:
builder.setNegativeButton("No", null);
final AlertDialog dialog = builder.create();
dialog.show();
editText.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
String text = editText.getText().toString();
...
...
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
if(button != null) {
if(text.trim().length()>0) {
button.setEnabled(true);
}
else {
button.setEnabled(false);
}
}
}
...
...
旧答案
将您的else
更改为以下内容:
...
...
else {
button = dialogo.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}
...
...
答案 1 :(得分:1)
最初,当您单击编辑文本时,将触发addTextChangedListener,因为您尚未输入并发送文本text.trim().length()=0
,因此控件将转到else块。
在你的else块中,你没有初始化按钮,因此是NPE。
你也在else块中写了以下一行
button = dialogo.getButton(AlertDialog.BUTTON_POSITIVE);