EditText的requestFocus()在运行android P(API 28)的设备上不起作用

时间:2018-08-29 09:41:17

标签: android

我正在使用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) {

        }
    });

请帮助我

提前谢谢

4 个答案:

答案 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毫秒。