【问题标题】:Android: EditText Validation with TextWatcher and .setError()Android:使用 TextWatcher 和 .setError() 进行 EditText 验证
【发布时间】:2012-11-01 01:53:11
【问题描述】:

我已经使用以下代码对TextEdit 进行了简单验证:

    title = (EditText) findViewById(R.id.title);
    title.addTextChangedListener(new TextWatcher() {

        @Override
        public void afterTextChanged(Editable s) {
             if (title.getText().length() < 1) {
                    title.setError( "Title is required" );
               } else {
                    title.setError(null); 
               }
            
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            
        }
    });

该函数检查textchange 上是否插入了任何文本并且一切正常,直到我将光标放在已经为空的标题字段中,然后再次按删除。错误消息被重置并且textwatcher 未被调用,因为没有文本更改。在这种情况下,我什至如何显示错误消息?

【问题讨论】:

  • 文本观察器被调用。但是在已经为空的文本字段中,如果您按删除键,请注意没有文本更改,因此不会调用 afterTextChanged。
  • 找到了解决办法!请参阅下面的答案。

标签: android validation android-edittext textwatcher


【解决方案1】:

您还应该能够覆盖 onKeyUp 方法 (http://developer.android.com/reference/android/view/KeyEvent.Callback.html)。在那里,检查按下的键是否为KeyEvent.KEYCODE_DEL,然后检查 EditText 中的文本是否为空。如果是,请抛出您的错误。

【讨论】:

  • 很好的建议,但不鼓励使用 KeyEvent 进行软输入。 “不能保证软键盘上的任何按键都会产生按键事件,这由 IME 自行决定,默认的软键盘永远不会向任何针对 Jelly Bean 或更高版本的应用程序发送任何按键事件,只会发送针对 Ice Cream Sandwich 或更早版本的应用程序的某些按下删除键和返回键的事件”developer.android.com/reference/android/view/KeyEvent.html
  • 有趣,我没见过。如果是这样的话,我不完全确定 OP 可以完成他们想要的。
  • 太糟糕了,但感谢您的尝试!我放弃了,只是对提交进行了简单的检查...
【解决方案2】:

似乎TextView 内部有一个标志,如果键盘发送一个键命令但文本保持不变,则调用setError(null)。所以我将EditText 子类化并实现onKeyPreIme() 以在文本为“”时吞下删除键。只需在您的 XML 文件中使用 EditTextErrorFixed

package android.widget;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;

public class EditTextErrorFixed extends EditText {
    public EditTextErrorFixed(Context context) {
        super(context);
    }

    public EditTextErrorFixed(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextErrorFixed(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Don't send delete key so edit text doesn't capture it and close error
     */
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (TextUtils.isEmpty(getText().toString()) && keyCode == KeyEvent.KEYCODE_DEL)
            return true;
        else
            return super.onKeyPreIme(keyCode, event);
    }
}

【讨论】:

    【解决方案3】:

    检查最新的 textInputLayout 和 textInputEditText 以获得更好的结果- https://material.io/components/text-fields/android

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多