如何处理输入警告对话框中的空文本并控制警报按钮

问题描述 投票:1回答:2

我有一个alert dialog,我有来自alert dialog的输入。目前的问题是如果用户没有输入任何文本并单击确定按钮,我无法处理来自alert dialog的输入。如果用户没有输入任何文本并单击确定按钮而没有关闭textfield,如何设置alert dialog显示错误。以下是我的代码。

 final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setTitle("Save QR Code");
    builder.setMessage("Please enter the name for the QR Code.");
    builder.setCancelable(true);

    // Set up the input
    final EditText input = new EditText(getContext());
    input.setInputType(InputType.TYPE_CLASS_TEXT );
    builder.setView(input);

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Here is the part
            m_Text = input.getText().toString().trim();
            if(TextUtils.isEmpty(m_Text)){
                input.setError("Please Enter Name of the Image QR Code");
            }else {
                //do smtg
            }
        }
    });
    builder.show();
android android-edittext android-alertdialog
2个回答
1
投票

您应该稍后设置监听器:

final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setTitle("Save QR Code");
    builder.setMessage("Please enter the name for the QR Code.");
    builder.setCancelable(true);
// Set up the input
final EditText input = new EditText(getContext());
input.setInputType(InputType.TYPE_CLASS_TEXT );
builder.setView(input);

builder.setPositiveButton("OK", null);
AlertDialog dialog = builder.show();
Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setOnClickListener(view1 -> { 
        m_Text = input.getText().toString().trim();
        if(TextUtils.isEmpty(m_Text)){
            input.setError("Please Enter Name of the Image QR Code");
        } else {
            dialog.dismiss();
        }
});

你的方法的问题是AlertDialog仍然会使用它的监听器作为你的一种装饰器。所以它会调用你的监听器,但它仍然会关闭对话框。如果要阻止它,则需要在显示对话框后用您的内部侦听器覆盖它。


1
投票

添加TextWatcherEditText。文本为空时,显示错误消息。您甚至可以在PositiveButton中隐藏TextWatcher,以防止用户在输入无效时点击它。

        myEditText.addTextChangedListener(new TextWatcher() {
        boolean bIgnore = false; // indicates if the change was made by the TextWatcher itself.

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

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

        @Override
        public void afterTextChanged(Editable s) {
            if (bIgnore)
                return;

            bIgnore = true; // prevent infinite loop

            if (inputValidated(myEditText.getText().toString()) {
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setVisibility(View.VISIBLE);
                errorTextView.setVisibility(View.INVISIBLE);

            } else {
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setVisibility(View.INVISIBLE);
                errorTextView.setVisibility(View.VISIBLE);

            }

            bIgnore = false; // release, so the TextWatcher start to listen again.
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.