【问题标题】:Alert Dialog with EditText closes if input is empty如果输入为空,带有 EditText 的警报对话框将关闭
【发布时间】:2017-05-23 18:53:15
【问题描述】:

我有带有编辑文本的警报对话框。用户必须输入一些东西,如果没有,系统会提醒他这个输入是必需的。

这是更改对话框的代码:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Razlog storniranja?");

    // Set up the input
    final EditText input = new EditText(this);
    // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    input.setSingleLine(false);
    input.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION);
    builder.setView(input);

    // Set up the buttons
    builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    builder.setNegativeButton("Otkaži", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {

            if (m_Text.length()==0)
            {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");

            }

        }
    });

    builder.show();

但是当用户点击正按钮并且输入为空时,对话框关闭。我的代码中是否缺少某些内容以避免关闭对话框?

编辑

我想我找到了解决方案。最后一行builder.show(); 应该被删除,而应该添加这段代码:

    builder.setView(input);
    final AlertDialog alertDialog = builder.create();
    alertDialog.show();

    alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Boolean wantToCloseDialog = (input.getText().toString().trim().isEmpty());
            // if EditText is empty disable closing on possitive button
            if (!wantToCloseDialog) {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");
                alertDialog.dismiss();
            }
        }
    });

我希望这对其他人有所帮助。

【问题讨论】:

标签: java android android-alertdialog


【解决方案1】:

嗯,我不知道你想做什么。

我在使用您的代码时遇到的错误是:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

m_Text需要初始化。

如果 m_Text 未初始化,您可能需要更改 onDismiss 方法:

if (m_Text != null && m_Text.length()==0){ //this line
     input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
     input.setError("Upišite razlog storniranja!");
}

关于可取消的,您需要builder.cancelable(false); 并在需要时,builder.dismiss()

builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            m_Text = input.getText().toString();

            if (m_Text.isEmpty()) {
                input.setHint("Morate upisati razlog storniranja kartice (naloga)!");
                input.setError("Upišite razlog storniranja!");
                input.setFocusable(true);
            }else{
                dialog.dismiss();
            }
        }
    });

【讨论】:

    【解决方案2】:

    使用TextUtils.isEmpty() 检查empty 字符串。

    试试这个:

    builder.setPositiveButton("Spremi", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
    
            if(TextUtils.isEmpty(input.getText().toString())) {
                // Empty
                input.setError("Input is required!");
            } else {
                // Do something...
            }
        }
    });
    

    希望对你有帮助~

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2012-08-06
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多