Android:如何验证EditText输入?
我需要在一系列EditTexts上进行表单输入验证。 我使用OnFocusChangeListeners在用户输入每个之后触发验证,但这不符合上一个EditText的需要。
如果在键入最终的EditText时单击“完成”按钮,则InputMethod将断开连接,但技术上焦点永远不会丢失在EditText上(因此永远不会发生验证)。
什么是最好的解决方案?
当InputMethod从每个EditText解除绑定而不是焦点更改时,我应该监视吗? 如果是这样,怎么样?
14个解决方案
145 votes
你为什么不用afterTextChanged(Editable s)?
由于您有多个afterTextChanged(Editable s)箱需要验证,我认为以下内容适合您:
您的活动实现了afterTextChanged(Editable s)接口
您将TextChanged侦听器添加到EditText框
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
在重写的方法中,您可以使用afterTextChanged(Editable s)方法,如下所示
@Override
public void afterTextChanged(Editable s) {
// validation code goes here
}
Editable s并没有真正帮助查找哪个EditText框的文本正在被更改。 但是你可以直接检查EditText框的内容
String txt1String = txt1.getText().toString();
// Validate txt1String
用同样的方法。 我希望我很清楚,如果我是,它会有所帮助!:)
编辑:有关更清洁的方法,请参阅下面的克里斯托弗佩里的答案。
Nikhil answered 2019-04-23T06:27:36Z
105 votes
TextWatcher对我的口味有点冗长,所以我做了一些容易吞下的东西:
public abstract class TextValidator implements TextWatcher {
private final TextView textView;
public TextValidator(TextView textView) {
this.textView = textView;
}
public abstract void validate(TextView textView, String text);
@Override
final public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
@Override
final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }
@Override
final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}
只需像这样使用它:
editText.addTextChangedListener(new TextValidator(editText) {
@Override public void validate(TextView textView, String text) {