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都直接成功,功能没有受到影响,当然这种粗狂的修改方式很不推荐,如果时间充裕还是仔细研究一下代码修改比较好。

相关推荐
何盖(何松影)1 小时前
Android T startingwindow使用总结
android
小李飞飞砖2 小时前
Android 依赖注入框架详解
android
SUNxuetian3 小时前
【Android Studio】升级AGP-8.6.1,Find Usage对Method失效的处理方法!
android·ide·gradle·android studio·安卓
阿华的代码王国3 小时前
【Android】搭配安卓环境及设备连接
android·java
__water3 小时前
RHA《Unity兼容AndroidStudio打Apk包》
android·unity·jdk·游戏引擎·sdk·打包·androidstudio
一起搞IT吧6 小时前
相机Camera日志实例分析之五:相机Camx【萌拍闪光灯后置拍照】单帧流程日志详解
android·图像处理·数码相机
浩浩乎@6 小时前
【openGLES】安卓端EGL的使用
android
Kotlin上海用户组7 小时前
Koin vs. Hilt——最流行的 Android DI 框架全方位对比
android·架构·kotlin
zzq19968 小时前
Android framework 开发者模式下,如何修改动画过度模式
android
木叶丸8 小时前
Flutter 生命周期完全指南
android·flutter·ios