【问题标题】:EditText setError message does not clear after inputEditText setError 消息输入后不清除
【发布时间】:2012-07-24 23:32:00
【问题描述】:

好的,所以我只有一个 EditText 字段和一个按钮,按下时会触发 AsyncTask。

EditText playerName = (EditText)findViewById(R.id.playerEditText);

if(playerName.getText().toString().length() == 0 )
    playerName.setError("Player name is required!");
else {
    // do async task
}

问题是即使在我输入有效文本进行搜索后,错误消息似乎仍然存在。有没有办法在 EditText 不为空时立即消除错误?

【问题讨论】:

    标签: android


    【解决方案1】:

    在你的else括号中,输入playerName.setError(null),这将清除错误。

    【讨论】:

    • 这将在按下按钮时清除错误,但是当文本输入发生变化时应该清除它。它应该根据the docs 自动执行此操作:“当任何关键事件导致 TextView 的文本发生更改时,图标和错误消息将重置为 null。”
    • 我在按删除时看到了同样的情况,但在输入新文本时它会清除——Galaxy Nexus 4.3。在以前的操作系统中没有注意到。所以我会说 Android 被窃听了。
    • Backspace 似乎可以清除我的 2.3.3 手机上的错误消息,但在具有相同 APK 和支持库的 4.1.1 上却没有
    • 您可以使用TextWatcher 并覆盖afterTextChanged 方法。
    • @blahdiblah 你观察得很好。但不要认为这是一个错误.. 只是谷歌真的很烂 * tty doco。第二句说错误消息将设置为“null”,这意味着图标仍然处于活动状态。最后一句说图标和消息仅在 setError(null) 时才被清除(即重置)。谷歌本可以再投入 5 分钟来写这篇文章。可能正忙于数钱和研究自动驾驶汽车。
    【解决方案2】:

    API 文档:“当任何关键事件导致 TextView 的文本发生更改时,图标和错误消息将重置为 null。” 虽然不是这样 - 因此我们可以将其视为错误。

    如果使用 textNoSuggestions、textEmailAddress、textPassword 等 inputType,则在输入字符后会取消设置错误。几乎与记录的一样,但又不完全正确 - 当您删除一个字符时,错误仍然存​​在。 看来,使用 addTextChangedListener 和 setError(null) 的简单解决方法可以实现承诺的行为。

    此外,还有关于 Android 4.2 图标丢失的帖子。所以要小心使用。

    【讨论】:

    • 这个答案应该排名更高 - 它提供了非常有价值的信息。
    • 这真的很令人困惑,但不是错误......只是非常糟糕的 doco.... 请参阅我在已批准答案中的评论。
    • 25.1.0+ 仍然遇到错误。
    • @giulio 这是一个错误。例如,在我的手机中,问题仅发生在某些inputType 中,并且仅在我键入单个字符时才会发生。在第二个字符输入之后,EditText 的行为与预期相同,并且错误消失了。这种不一致更像是一个错误。
    【解决方案3】:

    试试这个监听器:

          playerName.addTextChangedListener(new TextWatcher()
                    {
                        public void afterTextChanged(Editable edt){
                            if( playerName.getText().length()>0)
                            {
                                 playerName.setError(null);
                            }
                        }
    

    【讨论】:

    • 测试长度 > 0 似乎是可选的。
    • 这是因为他说“只要EditText不为空就删除错误”如果你不做这个测试,如果用户输入一个字符并删除它,它将删除空框的错误.
    【解决方案4】:

    如果您想隐藏错误消息,一种方法是在编辑框上应用 onclicklistener,然后

    editTextName.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                editTextName.setError(Null)
            }
        });
    

    【讨论】:

    • 大写字段伤害了我的眼睛!但说真的……你应该试试editTextName
    • 这只有在用户准确地触摸EditTextname 时才有效...发生这种情况的机会较小。 (哦,这个名字让我呕吐!!!!!)
    【解决方案5】:

    以下代码对我有用

    @OnTextChanged(
                value = R.id.editTextName,
                callback = OnTextChanged.Callback.TEXT_CHANGED)
        public void afterInput(CharSequence sequence) {
            editTextName.setError(null);
            editTextName.setErrorEnabled(false);
        }
    

    '

    editTextName.setError(null) 会清除错误信息。

    editTextName.setErrorEnabled(false) 将删除额外的填充。

    【讨论】:

    【解决方案6】:

    在您的 EditText 和 onError 中添加一个 TextWatcher,使用 et.setError(errorMessage) 显示您的错误消息,否则您可以删除错误消息和错误图标,如下所示。

    // to remove the error message in your EditText
    et.setError(null);
    
    // to remove the error icon from EditText.
    et.setCompoundDrawables(null, null, null, null);
    

    【讨论】:

      【解决方案7】:

      这段代码对我有用。

      textInputSetting(binding.emailEdt)

      fun textInputSetting(view: TextInputLayout) {
          view.apply {
              this.editText!!.addTextChangedListener {
                  if (this.editText!!.text.isNotEmpty()) {
                      this.error = null
                      this.isErrorEnabled = false
                  }
              }
          }
      }
      

      【讨论】:

      • 这个问题有 六个现有答案,其中包括一个获得最高票数、接受了近 150 票的答案。你确定你的解决方案还没有给出吗?如果不是,您为什么认为您的方法改进了已通过社区验证的现有提案?在 Stack Overflow 上,提供解释总是很有用,但在问题已得到解决且让 OP 和社区都满意的情况下,它尤其很重要。通过解释您的答案有何不同以及何时可能更受欢迎来帮助读者。
      猜你喜欢
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2017-01-14
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多