1. 程式人生 > >Android O Settings原始碼流程分析(資料載入之二級選單)

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

最終將介面顯示出來;

 

點選進入下篇——資料載入之獲取及修改預設設定屬性值篇