Android 当按下键盘上的特定字符时,我可以切换到另一个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

我的应用程序中有3条编辑文本。我想这样做,如果用户输入EditText1并按空格键,他将被“发送”到第二个EditText,从EditText2到EditText3也是如此。然而,当在EditText中给出空格时,它不应该出现


这可能吗?我该怎么做?

是的,您可以使用
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)