как обрабатывать пустой текст из диалогового окна предупреждения ввода и управлять кнопкой предупреждения - PullRequest
1 голос
/ 16 марта 2019

У меня есть 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();

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Вы должны установить слушателя позже:

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 голос
/ 16 марта 2019

Добавьте TextWatcher к EditText. Когда текст пуст, покажите сообщение об ошибке. Вы даже можете скрыть 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.
        }
    });
...