Android11 AOSP Settings设置项没有阴影(遥控器操控)

前言

原本的AOSP Settings对遥控器的适配不太行,很多地方遥控器移过去,当聚焦到某一个设置项的时候会没有阴影聚焦框。这里对部分聚焦框的改动进行总结。

Preference有onBindViewHolder方法的

以蓝牙配对界面识别到的蓝牙列表项为例。这种只需要在onBindViewHolder中加监听就好了,十分简单。

阴影框:
packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothDevicePreference.java

java 复制代码
@@ -47,6 +47,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;

 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import android.graphics.Color;

 /**
  * BluetoothDevicePreference is the preference type used to display each remote
@@ -206,6 +207,17 @@ public final class BluetoothDevicePreference extends GearPreference {

     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
+        final View rootView = view.itemView;
+        rootView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                if (hasFocus) {
+                    rootView.setBackgroundColor(Color.argb(60, 128, 128, 128));
+                } else {
+                    rootView.setBackgroundColor(Color.argb(0, 0, 0, 0));
+                }
+            }
+        });
         // Disable this view if the bluetooth enable/disable preference view is off
         if (null != findPreferenceInHierarchy("bt_checkbox")) {
             setDependency("bt_checkbox");

点击事件:
packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothDevicePreference.java

java 复制代码
@@ -48,6 +48,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import android.graphics.Color;
+import android.view.KeyEvent;

 /**
  * BluetoothDevicePreference is the preference type used to display each remote
@@ -208,6 +209,18 @@ public final class BluetoothDevicePreference extends GearPreference {
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         final View rootView = view.itemView;
+        rootView.setOnKeyListener(new View.OnKeyListener() {
+            @Override
+            public boolean onKey(View v, int keyCode, KeyEvent event) {
+                if (event.getKeyCode()  == KeyEvent.KEYCODE_ENTER || event.getKeyCode()  == KeyEvent.KEYCODE_DPAD_CENTER) {
+                    ImageView imageView = (ImageView) view.findViewById(R.id.settings_button);
+                    if (imageView != null) {
+                        imageView.performClick();
+                    }
+                }
+                return false;
+            }
+        });
         rootView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
             @Override
             public void onFocusChange(View v, boolean hasFocus) {

MasterSwitchPreference
在packages/apps/Settings/res/xml/network_and_internet.xml有好几个是MasterSwitchPreference类型的,这里我们统一修改packages/apps/Settings/src/com/android/settings/widget/MasterSwitchPreference.java
@@ -30,6 +30,7 @@ import androidx.preference.PreferenceViewHolder;
 import com.android.settings.R;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.RestrictedPreference;
+import android.graphics.Color;

 /**
  * A custom preference that provides inline switch toggle. It has a mandatory field for title, and
@@ -97,6 +98,18 @@ public class MasterSwitchPreference extends RestrictedPreference {
             mSwitch.setChecked(mChecked);
             mSwitch.setEnabled(mEnableSwitch);
         }
+
+        final View rootView = holder.itemView;
+        rootView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                if (hasFocus) {
+                    rootView.setBackgroundColor(Color.argb(50, 128, 128, 128));
+                } else {
+                    rootView.setBackgroundColor(Color.argb(0, 0, 0, 0));
+                }
+            }
+        });
     }

     public boolean isChecked() {

RestrictedPreference

这个是xml中的com.android.settingslib.RestrictedPreference ,比如packages/apps/Settings/res/xml/network_and_internet.xml中的vpn_settings 就是这一类,这种直接将这个Preference改了。

java 复制代码
--- a/packages/apps/Settings/res/xml/connected_devices.xml
+++ b/packages/apps/Settings/res/xml/connected_devices.xml
@@ -41,7 +41,7 @@
         android:title="@string/connected_device_other_device_title"
         settings:controller="com.android.settings.connecteddevice.ConnectedDeviceGroupController"/>

-    <com.android.settingslib.RestrictedPreference
+    <Preference
         android:key="add_bt_devices"
         android:title="@string/bluetooth_pairing_pref_title"
         android:icon="@drawable/ic_add_24dp"
diff --git a/packages/apps/Settings/res/xml/network_and_internet.xml b/packages/apps/Settings/res/xml/network_and_internet.xml
index 6bf6dbaccf..421729e81b 100644
--- a/packages/apps/Settings/res/xml/network_and_internet.xml
+++ b/packages/apps/Settings/res/xml/network_and_internet.xml
@@ -99,7 +99,7 @@
         android:order="10"
         android:fragment="com.android.settings.datausage.DataSaverSummary"/>

-    <com.android.settingslib.RestrictedPreference
+    <com.android.settings.datausage.DataSaverPreference
         android:fragment="com.android.settings.vpn2.VpnSettings"
         android:key="vpn_settings"
         android:title="@string/vpn_settings_title"

我这边尝试过改成Preference或者com.android.settings.datausage.DataSaverPreference都直接成功,功能没有受到影响,当然这种粗狂的修改方式很不推荐,如果时间充裕还是仔细研究一下代码修改比较好。

相关推荐
尚久龙28 分钟前
安卓学习 之 用户登录界面的简单实现
android·运维·服务器·学习·手机·android studio·安卓
Modu_MrLiu32 分钟前
Android实战进阶 - 启动页
android·实战进阶·启动页·倒计时场景
出门吃三碗饭1 小时前
编译器构造:从零手写汇编与反汇编程序(一)
android·汇编
Just_Paranoid2 小时前
【WorkManager】无法在 Direct Boot 模式下初始化
android·jetpack·usermanager·workmanager·directboot
前端小超超2 小时前
如何配置capacitor 打包的安卓app固定竖屏展示?
android·前端·gitee
顾林海2 小时前
探秘Android JVM TI:虚拟机背后的"隐形管家"
android·面试·性能优化
刘大国4 小时前
<android>反编译魔改安卓系统应用并替换
android
恋猫de小郭4 小时前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架
android·前端·flutter
纤瘦的鲸鱼4 小时前
MySQL慢查询
android·adb
郭庆汝5 小时前
模型部署:(三)安卓端部署Yolov8-v8.2.99目标检测项目全流程记录
android·yolo·目标检测·yolov8