Android 12 Settings的Connected devices页面无法获取焦点问题

11 篇文章 0 订阅
8 篇文章 0 订阅

一、问题描述

        因为产品是要用遥控器操作的但是又非TV产品,不能使用TV版本的settings,只能对原生的pad版本Settings进行添加焦点选择操作。

        在客制化过程中,发现Connected devices页面进去后无法获取到焦点,导致控器操作不起作用。用鼠标点击页面中的一个条目,进入下一级菜单然后再返回,此时是可以用遥控操作的,但是退出到home页面再进入后又不行了。

二、问题分析

        在出问题的时候,执行dumpsys activity com.android.settings/.SubSettings,发现focus焦点在recyler_view上,而不是在item上。

         正常的时候,执行执行dumpsys activity com.android.settings/.SubSettings,发现focus焦点在item上。

         经过各种对比试验,发现问题原因应该是因为Connected devices页面里的条目都是动态构建的,耗时比较长,在view初始focus的时候,条目还没有加载完,所以导致条目无法获取焦点。

三、解决方案

        知道问题原因后就好处理了了,可以在条目加载完后重新初始化一次焦点。

        具体方案:在切换完fragment后,起一个handler延时300ms去触发系统重新获取焦点,这里用clearFocus()函数来清理掉recyler_view中的焦点,触发系统重新寻找合适的焦点条目。

--- a/Android/packages/apps/Settings/src/com/android/settings/SettingsActivity.java
+++ b/Android/packages/apps/Settings/src/com/android/settings/SettingsActivity.java
@@ -80,9 +80,12 @@ import com.android.settingslib.development.DevelopmentSettingsEnabler;
 import com.android.settingslib.drawer.DashboardCategory;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
+import androidx.recyclerview.widget.RecyclerView;
 
 import java.util.ArrayList;
 import java.util.List;
+import android.os.Handler;
+import android.os.Message;
 
 
 public class SettingsActivity extends SettingsBaseActivity
@@ -176,6 +179,9 @@ public class SettingsActivity extends SettingsBaseActivity
     private CharSequence mInitialTitle;
     private int mInitialTitleResId;
 
+    private static String curFragment;
+    private final static int MSG_HANDLE_CLEAR_FOCUS = 1;
+
     private BroadcastReceiver mDevelopmentSettingsListener;
 
     private boolean mBatteryPresent = true;
@@ -714,6 +720,15 @@ public class SettingsActivity extends SettingsBaseActivity
         transaction.commitAllowingStateLoss();
         getSupportFragmentManager().executePendingTransactions();
         Log.d(LOG_TAG, "Executed frag manager pendingTransactions");
+
+        curFragment = fragmentName;
+        if (curFragment.equals("com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment")) {
+            mHandler handler = new mHandler();
+            handler.sendEmptyMessageDelayed(MSG_HANDLE_CLEAR_FOCUS, 300);
+        }
+
     }
 
     private void updateTilesList() {
@@ -860,4 +875,28 @@ public class SettingsActivity extends SettingsBaseActivity
     public Button getNextButton() {
         return mNextButton;
     }
+
+    class mHandler extends Handler {
+        @Override
+        public void handleMessage(Message msg) {
+            switch(msg.what) {
+                case MSG_HANDLE_CLEAR_FOCUS:
+                    if (curFragment.equals("com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment")) {
+                        View focus = getCurrentFocus();
+                        if(focus != null){
+                            int listRootId = R.id.recycler_view;
+                            if(listRootId == focus.getId()){
+                                RecyclerView frv = (RecyclerView)findViewById(listRootId);
+                                frv.clearFocus();
+                            }
+                        } else {
+                        }
+                    }
+                    break;
+            }
+        }
+    }
+

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值