客户因为一些特殊的要求,需要在IMG中打包Android原生的Settings APP,我给他们导入后,他们又报了一个bug:
大概意思就是在某些子菜单有一些item无法获取焦点,调试发现焦点是可以获取的。只是获取焦点是颜色没有变化,体验不好。
测试发现效果如下(不止这一个地方,还有其他好几个地方都是第一个item不行):
经排查代码发现第一行使用的是:
RestrictedPreference类型:以下全部代码都在:framework/base/packages/SettingsLib/目录下
public class RestrictedPreference extends TwoTargetPreference {
继续找到父类:
public class TwoTargetPreference extends Preference {
...
private void init(Context context) {
setLayoutResource(R.layout.preference_two_target);
mSmallIconSize = context.getResources().getDimensionPixelSize(
R.dimen.two_target_pref_small_icon_size);
mMediumIconSize = context.getResources().getDimensionPixelSize(
R.dimen.two_target_pref_medium_icon_size);
...
}
找到perference类的layout文件,修改如下,即可修复:
<!-- Based off preference_material_settings.xml except that ripple on only on the left side. -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
--- android:background="@android:color/transparent"
android:clipToPadding="false">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?android:attr/selectableItemBackground"(上面那个透明背景不去掉,会影响这行的效果)
android:gravity="start|center_vertical"
android:clipToPadding="false"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
具体原因这里不详细介绍,可以参考csdn上面的帖子。