Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对话框和编辑文本侦听器:在setEnabled时崩溃_Java_Android_Xml_Button_Android Edittext - Fatal编程技术网

Java 对话框和编辑文本侦听器:在setEnabled时崩溃

Java 对话框和编辑文本侦听器:在setEnabled时崩溃,java,android,xml,button,android-edittext,Java,Android,Xml,Button,Android Edittext,你好,我要发疯了,想知道这个对话中的问题在哪里。我正在尝试在edittext中创建一个对话框。。如果edittext为空,则必须禁用肯定的按钮。我写了这段代码 public class Example extends AlertDialog { AlertDialog.Builder builder; EditText mEditText; Context mContext; Button button; String text; protec

你好,我要发疯了,想知道这个对话中的问题在哪里。我正在尝试在
edittext
中创建一个对话框。。如果
edittext
为空,则必须禁用肯定的
按钮
。我写了这段代码

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
中写入内容时,我在if at this line
按钮的else中得到
NullPointerException
。setEnabled(false)问题出在哪里?

错误显然在这一行:-

        mEditText = new EditText(mContext);
通过这样做,您已经为Edittext创建了一个新对象。我们在创建动态edittext或任何其他小部件时都会这样做

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

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

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

}

if和else的范围仅限于下一站。若要使用多条语句,请将其括在块中。比如说-

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

@新年快乐是对的。您在其他部分缺少{}。如果不放置{},那么下一个语句将被视为else部分。
按钮.setEnabled(错误)在else块之外。因此,
按钮
对象没有在这里初始化。

是的,你是对的,但我在同一行中得到了相同的错误,原因相同。@Giovannimarioti看到更新的答案,我有类似的要求。什么?但是你在说什么?编辑文本可以通过友好方式创建。