使用button.setEnabled()进行EdiTtext崩溃

时间:2014-01-01 07:41:08

标签: java android xml android-edittext

我正在尝试使用侦听器创建一个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);

为什么呢?我怎么解决?

2 个答案:

答案 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);