【问题标题】:requestFocus() for EditText not working on devices running android P (API 28)用于 EditText 的 requestFocus() 在运行 android P (API 28) 的设备上不起作用
【发布时间】:2019-02-04 01:22:08
【问题描述】:

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

        }
    });

请帮我解决这个问题

提前谢谢你

【问题讨论】:

  • 你能贴出你的代码吗
  • @jle 在我的情况下它依赖于操作系统,对于其余的 android 操作系统版本它工作正常。
  • @Sniffer 我只调用了一行,即onRequestFocus(),它不起作用,我没有关注EditText
  • 在你的清单文件中检查这个 android:windowSoftInputMode="stateAlwaysVisible"

标签: android


【解决方案1】:

我在装有 Android P sdk 的设备上的 OTP 屏幕也遇到了同样的问题。问题是我将editText的高度和宽度设置为0dp,这是在android P中禁用焦点, 如 Android P 更改日志中的 Android Developer 页面所述: android-9.0-changes-28#ui-changes

面积为 0(宽度或高度为 0)的视图不再可聚焦。

【讨论】:

  • 感谢它拯救了我的一天
  • 就是这样。谢谢!
  • 带我去寻找它。非常感谢。
【解决方案2】:

这是 Android P 的问题。对我有用的是以下代码块,所以在这里分享:

enterOtpTextFrame.postDelayed(Runnable {
            enterOtpTextFrame.requestFocus()
        }, 100
        )

我们需要使用 postDelayed 调用 requestFocus 并使用一些小时间量。在我的例子中是 100 毫秒。

【讨论】:

    【解决方案3】:

    这里是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 请将 focusablefocusableInTouchMode 设置为 true。

    简而言之,我的意思是确保您的编辑文本满足官方文档中提到的所有要求,以便 requestFocus 正常工作。

    【讨论】:

      【解决方案4】:

      在弹出警告对话框时遇到了类似的问题。就我而言,延迟焦点请求或强制弹出软键盘不起作用。即使我可以设法弹出键盘,焦点仍停留在主要活动中的 EditText 上;不用说我已经尝试清除它的焦点,甚至禁用它。 然而,延迟弹出 alertDialog 成功了:

      final AlertDialog alertDialog = alertDialogBuilder.create(); //a builder of your own
      final Runnable r = new Runnable() {
          public void run() {
          alertDialog.show();
        }
      };
      editTextOnMainActivity.postDelayed(r, 100);
      

      【讨论】:

        猜你喜欢
        • 2016-09-14
        • 2011-09-02
        • 2019-01-01
        • 2011-05-23
        • 2016-12-05
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2019-07-30
        相关资源
        最近更新 更多