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