Android 当按下键盘上的特定字符时,我可以切换到另一个EditText吗?
我的应用程序中有3条编辑文本。我想这样做,如果用户输入EditText1并按空格键,他将被“发送”到第二个EditText,从EditText2到EditText3也是如此。然而,当在EditText中给出空格时,它不应该出现Android 当按下键盘上的特定字符时,我可以切换到另一个EditText吗?,android,android-studio,kotlin,Android,Android Studio,Kotlin,我的应用程序中有3条编辑文本。我想这样做,如果用户输入EditText1并按空格键,他将被“发送”到第二个EditText,从EditText2到EditText3也是如此。然而,当在EditText中给出空格时,它不应该出现 这可能吗?我该怎么做?是的,您可以使用TextWatcher Java版本 et1.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSeq
这可能吗?我该怎么做?是的,您可以使用
TextWatcher
Java版本
et1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s != null && s.endsWith("Your_special_char")){
yourDesiredEditText.requestFocus();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
科特林版本
et1.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
if (p0?.endsWith("Your_special_char") == true){//it will eliminate nullability (trick)
yourDesiredEditText.requestFocus()
}
}
})
编辑
我唯一的问题是,在每个事件中都会有大量的代码
好的,我将使用Kotlin扩展函数提供一个干净整洁的解决方案
fun EditText.forwardFocusOnSpecialCharEntered(targetEditText: EditText) {
this.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {}
override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}
override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
if (p0?.endsWith(" ") == true) targetEditText.requestFocus()
}
})
}
用法
现在,使用一行代码,您就可以实现您的目标,并且代码保持干净易读当然。您需要在每个文本框上创建一个TextWatcher,只需监视按键。当发送相应的按键(空格)时,.requestFocus()将显示在下一个按键上 我没有时间为您收集一个样本,所以我将只链接到一个
textwatcher有很多样板代码,但你不需要在所有函数中都放代码,只需要其中一个。你应该将这个textwatcher添加到第一和第二个编辑文本中,第一个在第二个上做
requestFocus()
,第二个在第三个上做requestFocus()
爪哇:
editText1.addTextChangedListener(新的TextWatcher(){
@凌驾
public void beforeTextChanged(字符序列s、int start、int count、int after){}
@凌驾
公共无效后文本更改(可编辑的s){}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
如果(s.endsWith(“”){
editText2.requestFocus();
}
}
});
科特林:
editText1.addTextChangedListener(对象:TextWatcher(){
覆盖后文本更改(s:可编辑?{}
重写beforeTextChanged(s:CharSequence?,start:Int,count:Int,after:Int){}
重写onTextChanged(s:CharSequence?,start:Int,before:Int,count:Int){
如果(s?.endsWith(“”):false){
editText2.requestFocus()
}
}
});
我唯一的问题是每次事件都会产生大量代码。不过这可能是必要的。我会把它拉到一个单独的对象(TextWatcher)中,但似乎没有一个默认的方法来知道哪个控件调用了它。也许你能检测到主动控制?
firstEditText.forwardFocusOnSpecialCharEntered(secondEditText)
secondEditText.forwardFocusOnSpecialCharEntered(thirdEditText)
thirdEditText.forwardFocusOnSpecialCharEntered(firstEditText)