【问题标题】:dialog and edittext listener: crash at setEnabled对话框和 edittext 侦听器:在 setEnabled 处崩溃
【发布时间】:2014-01-01 08:55:58
【问题描述】:

你好,我很想知道这个对话框的问题出在哪里。我正在尝试在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 中写一些东西时,我在button.setEnabled(false); 这一行的if 中的else 中得到NullPointerException 问题出在哪里?

【问题讨论】:

    标签: java android xml button android-edittext


    【解决方案1】:

    if 和 else 的范围只到下一条语句。如果您想使用多个语句而不是将其包含在块中。例如-

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案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);
        
        }
        

        【讨论】:

        • 是的,你是对的,但我在同一行遇到了同样的错误,原因相同。
        • @GiovanniMariotti 看到更新的答案,我有类似的要求。
        【解决方案4】:

        错误显然在这一行:-

                mEditText = new EditText(mContext);
        

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

        在正常情况下,您需要传递对您的编辑文本的引用,您必须在编辑文本的 xml 文件中称为“id”的属性中给出该引用:-

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

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

        我希望你现在明白了

        【讨论】:

        • 什么?但你在说什么? EditTexts 可以动态创建。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 2022-11-09
        相关资源
        最近更新 更多