我的屏幕上有6个编辑文本(用于输入6位数字) 如果我在一个EditText字段上输入1位数,焦点应该转到下一个,依此类推。 如果我在某些编辑文本字段上返回空格,则焦点应该转到上一个edittext字段
为此,我使用了以下代码
EditText2.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (EditText2.getText().toString().length() == 1) {
EditText3.requestFocus();
}
else if (EditText2.getText().toString().length() == 0) {
EditText1.requestFocus();
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void afterTextChanged(Editable s) {
}
});
通常情况下,如果我没有在任何编辑文本上点击退格键,则ontextchange侦听器可以正常工作。如果我在EditText2上按退格键并登陆EditText1(它上面有一些值)并尝试在其上输入内容。由于addTextChangedListener不起作用,光标不会转到EditText2。
非常感谢任何帮助。
答案 0 :(得分:0)
我假设您可能已将EditText
字段设置为maxLength
的1.这样的事情:
<EditText
android:id="@+id/edit_text_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLength="1"
android:inputType="number"
android:digits="0123456789"
/>
当maxLength
设置为1时,尝试输入其他字符时不会触发TextWatcher
。解决问题的一种方法是向后移动以使用editText.setSelection(0, editText.length());
请参阅下面的工作示例:
final List<EditText> fields = new ArrayList<>();
fields.add((EditText) findViewById(R.id.edit_text_one));
fields.add((EditText) findViewById(R.id.edit_text_two));
fields.add((EditText) findViewById(R.id.edit_text_three));
fields.add((EditText) findViewById(R.id.edit_text_four));
fields.add((EditText) findViewById(R.id.edit_text_five));
fields.add((EditText) findViewById(R.id.edit_text_six));
for (EditText editText : fields) {
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
for (int i = 0; i < fields.size(); i++) {
// Determine which one of the fields is focused
if (fields.get(i).hasFocus()) {
if (charSequence.length() == 1) {
// If the focused field has a character in it, move to the next field
if (fields.size() > i + 1) {
EditText nextField = fields.get(i + 1);
nextField.requestFocus();
}
} else if (charSequence.length() == 0) {
// If the focused field was deleted, move to the previous field
if (i - 1 >= 0) {
EditText prevField = fields.get(i - 1);
prevField.requestFocus();
// Select the text so it will be replaced when pressing another button
prevField.setSelection(0, prevField.getText().length());
}
}
break;
}
}
}
@Override public void afterTextChanged(Editable editable) {}
});
}