关于AOSP Settings模块客制化(一)客制化Prefence菜单

写在开头:AI的发展很迅速,很少去使用博客、百度搜索相关知识,解决方案了。博客只能慢慢更新,更新一些实际遇到的问题以及解决方案。

前景提要:最近在做一个大型“客制化”的项目:在原有的基线上大量客制化各个APP、UI等,此时在Settings中客制化标题栏、客制化菜单列表,我们知道Settings的菜单就是由Perference构成的,我在另一篇文章中有介绍:Android Preference浅析(设置Setting)-CSDN博客。于是着手于Settings关于菜单列表的客制化:

我们需要(例如SwitchPrference等也需要保持一致):

1.去除Perference的图标以及图标占位(icon设置为null的时候Preference前端会有一个空白占位,很不协调)

2.标题16sp、子标题11sp

3.Preference右侧显示一个箭头(Settings HomePage 显示,二级菜单不显示)

效果例如:

于是我开始AI、百度等等搜索相关方案:

1.在逻辑代码中在SettingsBase中有一个getPreferenceScreen方法可以获取PreferenceScreen并可以遍历它,在遍历中去setLayout各个Preference(要遍历、要判断类型,麻烦且影响代码效率)

2.一个个在逻辑代码中设置android:layout,可以对部分Preference设置布局样式(无法一次性做到全部适配)

各个方法都没有达到最理想的效果,自己学习排查下,观察到AOSP中Settings value文件夹中有一个style_preference.xml(res/values/style_preference.xml),并查看theme.xml。

原来对于Settings APP而言,设置theme.xml中的preferenceTheme就是设置Preference的主题样式,原生中preferenceTheme又指向到style_preference中的样式。

例如上述代码就规定了普通的Preference、开关Preference、PreferenceCategory的样式,那么我们在对应的样式中添加需要的即可,例如按照我们的需求我们需要去除图标、显示箭头,那么我们就单独写了一个xml,使用android:layout指向该xml即可(需要包含一些必要的控件,否则会报错,例如android.id.title、summary、widget_frame等,建议就是去framework中复制原生的preference的xml来改)

这样所有的SwitchPreference都遵循了该样式res/layout/switch_preference_layout

你需要检查Settings下是否有其他菜单没有遵循该样式,如果有一般则是该菜单是自定义菜单,你可以在Controller中的构造方法中setLayout或者在Fragment中findPreference找到他单独setLayout,这种自定义的菜单数量不多,所以可以这样单独客制化

你可能感兴趣的:(Android各类bug,android,bug,学习,android,studio)