我正在使用EditText's
接受OTP,一旦用户在字段中输入数字,用户便会专注于下一个EditText
。在所有设备上都可以正常工作。 但是在运行Android OS P的设备(即API 28)上,requestFocus()
不起作用,并且由于焦点不会自动移动,因此用户无法向连续的EditTexts
输入数字。
这里是代码-默认情况下,所有EditText's
都被禁用,以防止打开系统键盘。我正在使用自己的CustomKeybaord
接受数字。但是,除了Android P以外,它都可以使用。
mEtCode1.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.d("BEFORE_", charSequence.toString());
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
hideError(charSequence.toString());
if (!charSequence.toString().isEmpty()) {
mEtCode2.requestFocus();
mEtCode1.setBackground(getResources().getDrawable(R.drawable.verify_code_edit_text_background));
mEtCode2.setBackground(getResources().getDrawable(R.drawable.verify_code_edit_text_background));
mEtCode1.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
请帮助我
提前谢谢
答案 0 :(得分:2)
在具有Android P sdk的设备上,我的OTP屏幕出现了相同的问题。问题是我将editText的高度和宽度设置为0dp,这在android P中禁用了焦点, 如Android P更改日志中Android开发者页面所述: android-9.0-changes-28#ui-changes
区域为0(宽度或高度为0)的视图不再可聚焦。
答案 1 :(得分:0)
这是requestFocus方法的官方文档。它在那里声明,只有在您要聚焦的所需视图已启用,具有大小,可见,可聚焦且为FocusableInTouchMode的情况下,它才起作用。
我有完全一样的问题。我正在使用数据绑定设置EditText的 enable 状态。我意识到requestFocus无法正常工作,因为由于某些未知原因,数据绑定无法及时启用我的textview。
这是我的代码:
/*
setMyEditTextEnabled is my method to which my view is binded i.e.
android:enabled="@{vm.myEditTextEnabled, default=false}"
This worked for all version except Android P because it has
some timing issues with API 28 (not sure what)
*/
//binding.getVm().setMyEditTextEnabled(true);
/*
So to make it work, I am enabling my EditText directly and
it works for all versions.
*/
binding.myEditText.setEnabled(true);
binding.myEditText.requestFocus();
此外,如以下博文所述:EditText requestFocus not working 还要将 focusable 和 focusableInTouchMode 设置为true。
简而言之,我的目的是确保您的编辑文本满足官方文档中提到的所有要求,以便要求工作正常。
答案 2 :(得分:0)
Behavior changes: apps targeting API level 28+ :
活动不再以触摸方式隐式分配初始焦点。相反,您可以根据需要明确请求最初的关注。
显式请求焦点的最简单方法通常是<requestFocus>
XML标记。
答案 3 :(得分:0)
这是Android P的问题。对我有用的是以下代码块,因此请在此处共享:
enterOtpTextFrame.postDelayed(Runnable {
enterOtpTextFrame.requestFocus()
}, 100
)
我们要求使用postDelayed调用requestFocus并花费少量时间。在我的情况下是100毫秒。