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

最终将界面显示出来;

      

 

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

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值