資訊架構

Android 8.0 推出了全新的資訊架構,讓「設定」應用程式能 簡化設定的整理方式,並讓使用者 快速找出可自訂 Android 裝置的設定。 Android 9 導入了一些改善項目,提供更多 設定功能和更簡易的實作方式。

範例和來源

「設定」中大部分的網頁目前都使用新架構來導入。不錯 例如 DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

以下列出重要元件的檔案路徑:

  • CategoryKeypackages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistrypackages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragmentpackages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceControllerframeworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (已於 Android 9 推出): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

實作

我們建議裝置製造商調整現有的設定資訊 並視需求插入其他設定頁面 合作夥伴專屬功能將偏好設定從舊版頁面移動 (實作為 SettingsPreferencePage) 到新頁面 (使用 DashboardFragment) 可能較為複雜。偏好設定從 舊版網頁可能無法使用 PreferenceController 導入。

因此,如要將偏好設定從舊版頁面移至新頁面,您需要建立 PreferenceController,並將程式碼移到控制器中, 在新 DashboardFragment 中執行個體化。Google Cloud 的 API PreferenceController要求提供姓名和 相關文件。

強烈建議您為每個 PreferenceController 新增單元測試。 如果變更內容提交至 Android 開放原始碼計畫,就必須進行單元測試。 如要進一步瞭解如何編寫 Robolectric 測試,請參閱 讀我檔案 packages/apps/Settings/tests/robotests/README.md

外掛程式樣式資訊架構

每個設定項目都會做為偏好設定。建立偏好很容易 內容則從一個頁面移到另一個頁面

為方便您輕鬆移動多項設定,Android 8.0 推出了 包含設定項目的外掛程式樣式主機片段。設定項目為 模擬成外掛程式式控制器因此設定頁面是由 單一主機片段和多個設定控制器。

資訊主頁片段

DashboardFragment 是外掛程式樣式的偏好設定控制器主機。 片段繼承自 PreferenceFragment,且設有掛鉤 展開並更新靜態偏好設定清單和動態偏好設定清單。

靜態偏好設定

靜態偏好設定清單是在 XML 中使用 <Preference> 標記定義。A 罩杯 DashboardFragment 實作會使用 使用 getPreferenceScreenResId() 方法定義包含哪個 XML 檔案 要顯示的靜態偏好設定清單。

動態偏好設定

動態項目代表資訊方塊,可導向外部或內部 活動。一般來說,該意圖會將使用者導向不同的設定頁面。例如: 「Google」設定項目是動態項目。動態 項目定義於 AndroidManifest (如下所述) 並載入 透過 FeatureProvider (定義為 DashboardFeatureProvider) 進行通知。

動態設定比靜態設定更繁重 因此,一般開發人員應將設定視為靜態設定。 不過,動態設定在下列任一情況下相當實用:

  • 在「設定」應用程式中未直接導入設定 (例如 插入原始設備製造商 (OEM)/電信業者應用程式實作的設定)。
  • 「設定」首頁應會顯示這項設定。
  • 設定中已有「活動」設定,但不想將 額外靜態設定

如要將活動設為動態設定,請按照下列步驟操作:

  • 只要在 活動。
  • 告知「設定」應用程式所屬的類別。類別是常數 定義於 CategoryKey
  • 選用:在顯示設定時新增摘要文字。

以下是從「DisplaySettings」設定應用程式中擷取的範例。

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

在轉譯時,片段會要求提供來自兩個靜態值的偏好設定清單 AndroidManifest 中定義的 XML 和動態設定。無論 PreferenceController 是在 Java 程式碼或 XML 中定義 DashboardFragment 會管理各項設定的處理邏輯 透過 PreferenceController (詳見下文)。然後 而是以混合清單的形式顯示在 UI 中。

PreferenceController

導入 PreferenceController 有所差異 詳見本簡報 專區。

Android 9 中的 PreferenceController

PreferenceController 包含可與 包括顯示、更新、搜尋索引等

PreferenceController 介面的定義為 BasePreferenceController。如需範例,請參閱 packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

BasePreferenceController 有多個子類別,每個子類別 對應至「設定」應用程式預設支援的特定 UI 樣式。適用對象 例如,TogglePreferenceController 的 API 可直接對應 如何與切換型偏好設定 UI 互動。

BasePreferenceController 的 API 如下 getAvailabilityStatus()displayPreference()handlePreferenceTreeClicked(), 等。各項目的詳細說明文件 API 位於介面類別

導入 BasePreferenceController (和 例如 TogglePreferenceController 建構函式簽章須符合以下任一項目:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

為片段安裝偏好設定時,資訊主頁會提供 在顯示時間之前附加 PreferenceController。在安裝時 控制器會連接至片段,因此未來所有相關事件都會 就會傳送到控制器

DashboardFragment 會將一份清單 螢幕 PreferenceController。在片段的 onCreate(),系統會針對 getAvailabilityStatus() 方法,如果傳回 true, 叫用 displayPreference() 來處理顯示邏輯。 另外,「getAvailabilityStatus()」也相當重要。 比較哪些項目可在搜尋時派上用場

Android 8.x 版本中的 PreferenceController

PreferenceController 包含可與 包括顯示、更新、搜尋索引依此類推

對應至偏好設定互動, PreferenceController 的介麵包含 API isAvailable() displayPreference()handlePreferenceTreeClicked() 等。 各個 API 的詳細說明文件請參閱介面類別。

為片段安裝偏好設定時,資訊主頁會提供 在顯示時間之前附加 PreferenceController。在安裝時 控制器會連接至片段,因此未來所有相關事件都會 就會傳送到控制器

DashboardFragment 會在畫面中保留 PreferenceControllers 清單。在片段的 onCreate() 中, 系統會叫用 isAvailable() 方法的控制器 傳回 true,而叫用 displayPreference() 來處理顯示 邏輯。

使用 DashboardFragment

將偏好設定從網頁 A 移至 B

如果偏好設定是靜態列在原始網頁的偏好設定 XML 中 檔案,請按照 Android 靜態移動程序操作 。否則,請按照動態移動程序操作 。

Android 9 中的靜態動作

  1. 找出原始網頁和目的地的偏好設定 XML 檔案 頁面。您可以在網頁的 getPreferenceScreenResId() 方法。
  2. 移除原始網頁的 XML 偏好設定。
  3. 將偏好設定新增至到達網頁的 XML。
  4. 將這項偏好設定的 PreferenceController 從 存取原始頁的 Java 實作項目這通常位於 createPreferenceControllers()。控制器可能會在以下位置中宣告: XML

    注意:偏好設定可能沒有 PreferenceController

  5. 將到達網頁的 PreferenceController 例項化 createPreferenceControllers()。如果 PreferenceController 已在舊頁面的 XML 中定義,請加以定義 產生新網頁的 XML 檔案

Android 9 中的動態移動

  1. 找出原始網頁和到達網頁代管的類別。你可以 可在「DashboardFragmentRegistry」中找到這項資訊。
  2. 開啟包含您設定的 AndroidManifest.xml 檔案 必須移動並找出代表此設定的 Activity 項目。
  3. 為下列項目設定活動的中繼資料值: 按下 com.android.settings.category 即可設為新頁面的類別鍵。

Android 8.x 版本中的靜態移動

  1. 找出原始網頁和到達網頁的偏好設定 XML 檔案。
  2. 您可以透過頁面的 getPreferenceScreenResId() 方法找到這項資訊。
  3. 移除原始網頁 XML 中的偏好設定。
  4. 將偏好設定新增至到達網頁的 XML。
  5. 移除這項偏好設定的 PreferenceController: 存取原始頁的 Java 實作項目通常主題為 getPreferenceControllers()
  6. 注意:偏好設定可能沒有 PreferenceController

  7. 將到達網頁的 PreferenceController 例項化 getPreferenceControllers()

Android 8.x 版的動態移動

  1. 找出原始網頁和到達網頁代管的類別。您可以 這項資訊。DashboardFragmentRegistry
  2. 開啟包含您設定的 AndroidManifest.xml 檔案 必須移動並找出代表此設定的 Activity 項目。
  3. 變更活動在 com.android.settings.category 的中繼資料值, 將值點設為新頁面的類別鍵。

在頁面中建立新的偏好設定

如果偏好設定是靜態列在原始網頁的偏好設定 XML 中 檔案,請按照下方的靜態程序執行。否則,請按照 動態程序。

建立靜態偏好設定

  1. 找出該網頁的偏好設定 XML 檔案。您可以在 傳入網頁的 getPreferenceScreenResId() 方法
  2. 在 XML 中新增偏好設定項目。請確認變數均不重複 android:key
  3. 在網頁的PreferenceController getPreferenceControllers() 方法。
    • 在 Android 8.x 及 Android 9 中 (選用) 針對此偏好設定例項化 PreferenceController 網頁的 createPreferenceControllers() 方法。

      如果其他位置已採用這項偏好設定, 已有頻道的 PreferenceController。您可以重複使用 無須建立新資源,PreferenceController

    • 從 Android 9 開始,您可以選擇宣告 PreferenceController (在偏好設定旁邊)。例如:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

建立動態偏好設定

  1. 找出原始網頁和到達網頁代管的類別。您可以 這項資訊。DashboardFragmentRegistry
  2. 在「AndroidManifest」中建立新活動
  3. 請在新的活動中新增必要的中繼資料,以便定義設定。將 將 com.android.settings.category 的中繼資料值設為相同的值 如步驟 1 所定義

建立新專頁

  1. 建立沿用自 DashboardFragment 的新片段。
  2. DashboardFragmentRegistry 中定義類別。

    注意事項:此為選用步驟。如果不需要 此頁中的任何動態偏好設定,不需要提供類別鍵。

  3. 按照步驟新增這個頁面所需的設定。如要 請參閱「導入」一節。

驗證

  • 在「設定」中執行 Robolectric 測試。所有現有和新的測試都應該 略過
  • 建構並安裝設定,然後手動開啟修改的頁面。 網頁會立即更新。