【问题标题】:how to handle empty text from the input alert dialog and control the alert button如何处理输入警报对话框中的空文本并控制警报按钮
【发布时间】:2019-08-07 10:36:27
【问题描述】:

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

 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


    【解决方案1】:

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

            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.
            }
        });
    

    【讨论】:

      【解决方案2】:

      你应该稍后设置监听器:

      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 仍会将其侦听器用作您的一种装饰器。所以它会调用你的监听器,但它仍然会关闭对话框。 如果你想阻止它,你需要在显示对话框后用你的覆盖内部监听器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多