我有一个带有 3 个 EditText 字段的简单活动。
用户、通行证、确认
在“用户”字段中输入内容并单击键盘上的“下一步”后,我有一个 setOnFocusChangeListener 来验证输入。 如果验证失败,将打开一个对话框,其中包含一条消息和一个“确定”按钮。
对话框关闭后,我尝试以多种方式在我的用户编辑文本上请求焦点,通过在通过时释放它,通过尝试再次在用户上释放,通过请求而不是清除并再次请求,但当我单击另一个字段时,软键盘将不会不要再次打开,否则我最终会看到两个带有闪烁光标的 EditText 字段。
有什么想法吗?
我建议使用 TextWatcher 验证用户的输入:
EditText textbox = new EditText(context);
textbox.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
// Your validation code goes here
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
});
仅在 afterTextChanged 方法中处理验证,不要触及其他两个,如 文档 中建议的那样。然而,每次输入更改时都会触发 afterTextChanged get ,因此如果用户输入单词“hello”,则在输入 h 时调用此方法,然后在输入 e 时再次调用,依此类推...此外,如果修改 edittext 值在 afterTextChanged 中, get 方法也被调用。
另一种方法是在 EditText 失去焦点时验证用户输入。为此,您可以使用:
textbox.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// Your validation code goes here
}
});
但是请注意,某些小部件可能无法抓住焦点,因此您的 Edittext 永远不会丢失焦点(例如使用按钮)。
此外,EditText 还提供了 setError 方法,该方法用红色错误标记标记 edittext,并向用户显示传递给 setError 的文本(该文本可以由您在调用 setError("Your error message") 时设置)。