对话和听众的EditText:崩溃的setEnabled处(dialog and edittext

2019-10-19 04:25发布

你好,我要疯了,了解哪里是在此对话框中的问题。 我想创建一个对话框,内部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我得到NullPointerException在其他里面,如果在该行button.setEnabled(false); 问题出在哪儿?

Answer 1:

如果和else范围仅仅是下一高达statment。 如果你想使用一个以上的声明比括在块。 例如-

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


Answer 2:

@Happy_New_Year是正确的。 你缺少{}中的其他部分。 如果你不把{},那么唯一的第二天陈述将被视为else部分。 所述button.setEnabled(false); 是else块之外。 因此, button对象不会被初始化这里。



Answer 3:

问题是在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);

}


Answer 4:

错误显然是在这一行: -

        mEditText = new EditText(mContext);

通过这样做,你已经创建了一个EditText一个新的对象。 我们做这样的事情时,我们创建了一个动态的EditText或任何其他部件。

在正常情况下,您需要将引用传递到您的EditText,你必须在在对的EditText例如XML文件被称为“ID”属性给: -

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

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

我希望你得到它现在



文章来源: dialog and edittext listener: crash at setEnabled