dialog和edittext listener:在setEnabled崩溃

时间:2014-01-01 08:55:58

标签: java android xml button android-edittext

您好我很想知道这个对话框中的问题在哪里。我正在尝试在edittext内创建一个对话框。如果edittext为空,则必须禁用肯定button,否则启用。我写了这段代码。

public class Example extends AlertDialog {

    AlertDialog.Builder builder;
    EditText mEditText;
    Context mContext;
    Button button;
    String text;

    protected Example(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        builder = new AlertDialog.Builder(context);
        this.mContext = context;
        mEditText = new EditText(mContext);
        builder.setView(mEditText);
        builder.setPositiveButton("Okay", null);
        builder.setNegativeButton("No", null);

        mEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                AlertDialog dialog = builder.create();

                text = mEditText.getText().toString();

                if(text.trim().length()>0) {

                    button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);

                    if(button != null)
                    button.setEnabled(true);

                    else
                        button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
                        button.setEnabled(false);
                }

                else
                    button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
                    button.setEnabled(false);

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }

        });

        builder.setTitle("Example Dialog");
        builder.create();
        builder.show();

    }
}

当我执行此代码并在edittext中写一些内容时,我会在{@ 1}处的if内的else处获得NullPointerException问题在哪里?

4 个答案:

答案 0 :(得分:1)

if和else的范围仅限于下一个语句。如果要使用多个语句将其括在块中。例如 -

else
{
button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
}

答案 1 :(得分:1)

@Happy_New_Year是对的。你在其他部分缺少{}。如果你没有放{},那么唯一的下一个语句将被视为else部分。 button.setEnabled(false);超出了else块。所以这里没有初始化button对象。

答案 2 :(得分:0)

问题发生在text = mEditText.getText().toString();

当文字为null null.toString();时会崩溃。

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s != null)
            {
                if (s.length() > 0)
                {
                    dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(true);
                }
                else {
                    dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);
                }
            }

        }

以下是我在项目中使用的完整代码

AlertDialog.Builder builder; // Declare Globally
AlertDialog dialog; // Declare Globally

    builder = new AlertDialog.Builder(this);

    builder.setCancelable(false);
    builder.setTitle("Add New Keyword");
    final EditText input = new EditText(this);
    input.setHint("Min 3 Chars");
    builder.setView(input);

    input.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s != null)
            {
                if (s.length() > 2)
                {
                    dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(true);
                }
                else {
                    dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);
                }
            }

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {

            if (input != null)
            {
                System.out.println("Entered Text" + input.getText().toString().trim());
            }
        }
    });

    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.dismiss();
        }
    });

    dialog = builder.create();
    dialog.show();
    dialog.getButton(Dialog.BUTTON_POSITIVE).setEnabled(false);

}

答案 3 :(得分:-1)

错误显然在这一行: -

        mEditText = new EditText(mContext);

通过这样做,您已为Edittext创建了一个新对象。当我们创建动态edittext或任何其他小部件时,我们会这样做。

在正常情况下,您需要传递对您的edittext的引用,您必须在编辑文本的xml文件中的名为“id”的属性中提供该引用,例如: -

 <EditText 
     android:id = "@+id/editText1"
     <!-- other properties-->
</EditText

在你的课堂上,首先需要这样做: - mEditText = (EditText)findViewById(R.id.editText1);

我希望你现在能得到它