Android O Settings
数据加载之二级菜单
二级菜单是动态加载和静态xml布局文件相结合的方式。
以“系统”这一项为例进行分析:
首先是清单文件AndroidManifest.xml
所对应的Fragment是SystemDashboardFragment.java,它继承DashboardFragment.java。
而DashboardFragment继承于PreferenceFragment
PreferenceFragment是通过xml文件来进行加载的,它是所有二级界面的基类。
先看静态加载部分:DashboardFragmen——>displayResourceTiles()
先调用getPreferenceScreenResId()获取xml布局文件的资源id,该方法在其子类SystemDashboardFragment中实现:
然后调用addPreferencesFromResource()方法加载该XML 文件
(相当于设置布局setContentView)
获取PreferenceScreen对象screen用于展示所有的子菜单项
遍历AbstractPreferenceController对象集合,获取到所有可展示的子菜单项;并将它添加进Screen对象中用于展示。
该集合是在SystemDashboardFragment中实现数据加载的工作;
下图是通过log打印出的“系统”项下所有可展示的子菜单:
注:AbstractPreferenceController是用于对所有菜单项进行统一管理的一个抽象类(例如展示或隐藏,监听点击事件等);
有几个重要的方法需要被重写:
1、getPreferenceKey()用于获取到XML文件中每个Preference节点对应的key值;
2、isAvailable()用于判断该菜单项是否可以显示
3、updateState()用于 当设置页面选项发生改变时
再看动态加载部分:DashboardFragmen——>refreshDashboardTiles()
首先是利用mDashboardFeatureProvider对象获取子菜单所属类别(例如:系统);
getCategoryKey()从DashboardFragmentRegistry.PARENT_TO_CATEGORY_KEY_MAP中获取Category值。
该值通过类名获取
存:PARENT_TO_CATEGORY_KEY_MAP.put(SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
然后获取该类别下所有的子菜单项;
然后创建一个List用于保存那些被移除的菜单项;
接下来就是遍历获取的tiles集合,
通过判断key值,是否为空,是否已经被包含(mDashboardTilePrefKeys集合)
对每一个符合要求的tile与Preference通过bindPreferenceToTile()进行绑定;
该方法实现是在:packages\apps\Settings\src\com\android\settings\dashboard\DashboardFeatureProviderImpl.java->bindPreferenceToTile()
最终将界面显示出来;
点击进入下篇——数据加载之获取及修改默认设置属性值篇