阅读 101

Settings模块-一级菜单数据加载

继上一篇文章之后,我们继续谈一谈Settings模块,一级菜单、二级菜单数据加载流程。

一级菜单数据加载

菜单数据加载首先从Settings.java开始分析,Settings继承自SettingsActivity,SettingsActivity继承自SettingsDrawerActivity,在SettingsDrawerActivity的onResume()中对数据进行加载。

图片8.png

1. 在onResume()中执行了一个异步操作:new CategoriesUpdateTask().execute()

private class CategoriesUpdateTask extends AsyncTask<Void, Void, Void> {
  
          private final CategoryManager mCategoryManager;
          public CategoriesUpdateTask() {
              mCategoryManager = CategoryManager.get(SettingsDrawerActivity.this);
          }  
         
          protected Void doInBackground(Void... params) {
             mCategoryManager.reloadAllCategories(SettingsDrawerActivity.this,getSettingPkg());              return null;
          }
         
          protected void onPostExecute(Void result) {
              mCategoryManager.updateCategoryFromBlacklist(sTileBlacklist);
              onCategoriesChanged();
          }
      }复制代码

reloadAllCategories() 方法加载数据

onCategoriesChanged() 实现CategoryListener,那么作为界面容器的DashboardSummary肯定重载了这个接口,实现了onCategoriesChanged()方法

2. reloadAllCategories()方法加载数据

(1)首先调用调用了getTilesForAction()方法

(2)调用getTilesForIntent方法

(3)getTilesForIntent中调用updateTileData方法 updateTileData方法,对Activity中的属性进行解析

(4)调用createCategory方法,创建DashboardCategory对象,并且根据tile的category来进行分类,最终getCategories方法会返回包含多个DashboardCategory的ArrayList.

3.onCategoriesChanged()

(1)调用rebuildUI()

(2)调用updateCategoryAndSuggestion(),DashboardSummary在onCreateView加载的布局R.layout.dashboard,是一个recycleview,将DashboardCategory加载进去。

二级菜单数据加载

二级菜单加载调用packages\apps\settings\src\com\android\settings\dashboard\DashboardFragment.java中的displayResourceTiles()方法。

而PreferenceFragment是通过xml文件来进行加载的,它是所有二级界面的基类。

图片9.png

private void displayResourceTiles() {
         final int resId = getPreferenceScreenResId();
         if (resId <= 0) {
             return;
         }
         addPreferencesFromResource(resId);
         final PreferenceScreen screen = getPreferenceScreen();
         Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values();
         for (AbstractPreferenceController controller : controllers) {
             controller.displayPreference(screen);
         }
     }复制代码

1.通过getPreferenceScreenResId方法获得要加载xml资源文件文件的ID

2.然后通过addPreferencesFromResource方法加载该xml资源文件, (addPreferencesFromResource方法的具体定义是在PreferenceFragment中)

3.然后获取PreferenceScreen的对象Screen用来展示所有的子菜单项

4.遍历AbstractPreferenceController对象集合,获得所有需要展示子菜单项,添加进screen进行展示。

AbstractPreferenceController是用于对所有菜单项进行统一管理的一个抽象类(例如展示或隐藏,监听点击事件等)
AbstractPreferenceController对象是通过mPreferenceControllers获取的。
mPreferenceControllers通过addPreferenceController()方法调用来进行添加。


作者:小郭不背锅
链接:https://juejin.cn/post/7026543696426303501


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐