Android:使用TextWatcher和.setError()进行EditText验证

时间:2012-11-12 16:06:57

标签: android validation android-edittext

我使用以下代码实现了对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

        }
    });

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

似乎内部TextView有一个标志,如果键盘发送一个键命令但文本保持不变,则调用setError(null)。所以我将EditText子类化并实现onKeyPreIme()以便在文本为&#34;&#34;时吞下删除键。只需在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);
    }
}