1

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

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

4

3 回答 3

0

如果键盘发送键命令但文本保持不变,则内部似乎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);
    }
}
于 2012-12-21T01:31:25.123 回答
0

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

于 2012-11-12T16:20:43.303 回答
0

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

于 2021-10-04T13:34:35.320 回答