Android O Settings源码流程分析(数据加载之二级菜单)

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()

最终将界面显示出来;

点击进入下篇——数据加载之获取及修改默认设置属性值篇

猜你喜欢

转载自blog.csdn.net/qq_34149526/article/details/83278597
今日推荐