问题描述
先说结论:可能是因为前后EditText中的文本类型不同
在一般情况下,例如转跳前后的text都是密码
第一次输入
<EditText
android:id="@+id/et_password_first"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/et_password_second"/>
第二次输入
<EditText
android:id="@+id/et_password_second"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:inputType="textPassword" />
可以看到以上类型都是textPassword,通过android:nextFocusForward="@+id/et_password_second"
可以直接进入第二个输入框而且软键盘会保持开启
但如果后一个EditText类型不一样,比如由密码类型转到数字型时
<EditText
android:id="@+id/et_verifyCode"
android:layout_width="142dp"
android:layout_height="wrap_content"
android:inputType="number" />
虽然焦点还在,但是软键盘被关闭了
解决方法如下
软键盘的关闭是不能阻止的,会报错,在此省略
思路是捕获用户Enter/下一个动作,重新打开键盘
在oncreate方法中
et_password_second.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
// 手动将焦点移动到下一个EditText
et_verifyCode.requestFocus();
// 显示软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et_verifyCode, InputMethodManager.SHOW_IMPLICIT);
return true; // 表示事件已被处理
}
return false; // 表示事件未被处理
}
});
}
不要忘了
et_password_second = findViewById(R.id.et_password_second);
et_verifyCode = findViewById(R.id.et_verifyCode);
这样的话转跳的实现完全从xml中拿了出来,界面只需要做正常的设计
<EditText
android:id="@+id/et_password_second"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:inputType="textPassword" />
<!--其余部分省略-->
<EditText
android:id="@+id/et_verifyCode"
android:layout_width="142dp"
android:layout_height="wrap_content"
android:inputType="number" />