安卓的EditText验证与TextWatcher和.setError()(Android: Edi

2019-07-03 18:40发布

我实现了一个简单的验证一个文字编辑,使用此代码:

    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

        }
    });

该funcion检查,如果有插在一个textchange任何文字,一切完美的作品,除非当我把我的光标已经是空的标题栏,然后按删除一次。 错误信息被重置了和textwatcher不叫,因为没有文字的变化。 我怎么能显示在这种情况下,错误信息?

Answer 1:

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



Answer 2:

看来,内部TextView有一个标志,并调用setError(null)如果键盘发送键命令,但文本保持不变。 所以我子类EditText和实施onKeyPreIme()吞下删除键,如果文本是“”。 只需使用EditTextErrorFixed与XML文件中:

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


文章来源: Android: EditText Validation with TextWatcher and .setError()