我使用以下代码实现了对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,因为没有文本更改。在这种情况下,我怎么能显示错误信息?
答案 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);
}
}