如何在填充 EditText 并按下新键时捕获事件?
How to catch event when EditText is filled and new key is pressed?
<EditText
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:imeOptions="actionNext"
android:inputType="textNoSuggestions|textCapCharacters"
android:maxLength="3"
android:hint="ABC"
/>
还有另一个 EditText
,当 name
中的所有 3 个符号都填满时,应该重点关注。
name.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
// Move to surname when all three symbols are entered.
if (name.text.toString().length == 3) {
surname.requestFocus()
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})
当我们输入1、2、3符号时,它就可以正常工作了。但是当我们 select 在 name
中的最后一个位置时,在键盘上按下一个新的字母,没有任何反应。我试图用
捕捉按键
name.setOnKeyListener { v, keyCode, event ->
if (name.text.getText().length == 3) {
surname.requestFocus()
}
false
}
但是没有发生事件。如何移动焦点?
在 beforeTextChanged() 中添加一个检查,检查字符序列的长度是否已经是 3 个字符,如果是,则请求关注姓氏
将maxLength
改为4
android:maxLength="4"
在afterTextChanged
中:
override fun afterTextChanged(s: Editable?) {
// Move to surname when all three symbols are entered.
if (name.isFocused() && name.text.toString().length > 3) {
surname.requestFocus();
name.setText(s.toString().substring(0,3));
}
}
根据@nupadhyaya 的回答,我是这样做的。
1) 删除了 android:maxLength="3"
(或者可以设置 android:maxLength="4"
)。
2) 为新符号添加了一个事件:
name.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
val text = name.text.toString()
if (text.length >= 3) {
surname.requestFocus()
if (text.length > 3) {
// Remove symbols after third.
name.setText(text.substring(0, 3))
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})
}
3) 为姓氏中的 Backspace
键添加了一个事件:
surname.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL && surname.text.toString().isEmpty()) {
// Move to the last symbol of name.
name.requestFocus()
name.setSelection(name.text.toString().length)
}
false
}
<EditText
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:imeOptions="actionNext"
android:inputType="textNoSuggestions|textCapCharacters"
android:maxLength="3"
android:hint="ABC"
/>
还有另一个 EditText
,当 name
中的所有 3 个符号都填满时,应该重点关注。
name.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
// Move to surname when all three symbols are entered.
if (name.text.toString().length == 3) {
surname.requestFocus()
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})
当我们输入1、2、3符号时,它就可以正常工作了。但是当我们 select 在 name
中的最后一个位置时,在键盘上按下一个新的字母,没有任何反应。我试图用
name.setOnKeyListener { v, keyCode, event ->
if (name.text.getText().length == 3) {
surname.requestFocus()
}
false
}
但是没有发生事件。如何移动焦点?
在 beforeTextChanged() 中添加一个检查,检查字符序列的长度是否已经是 3 个字符,如果是,则请求关注姓氏
将maxLength
改为4
android:maxLength="4"
在afterTextChanged
中:
override fun afterTextChanged(s: Editable?) {
// Move to surname when all three symbols are entered.
if (name.isFocused() && name.text.toString().length > 3) {
surname.requestFocus();
name.setText(s.toString().substring(0,3));
}
}
根据@nupadhyaya 的回答,我是这样做的。
1) 删除了 android:maxLength="3"
(或者可以设置 android:maxLength="4"
)。
2) 为新符号添加了一个事件:
name.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
val text = name.text.toString()
if (text.length >= 3) {
surname.requestFocus()
if (text.length > 3) {
// Remove symbols after third.
name.setText(text.substring(0, 3))
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
})
}
3) 为姓氏中的 Backspace
键添加了一个事件:
surname.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL && surname.text.toString().isEmpty()) {
// Move to the last symbol of name.
name.requestFocus()
name.setSelection(name.text.toString().length)
}
false
}