綜合搜尋

Android 8.0 針對「設定」選單新增了更強大的搜尋功能。這個 文件說明瞭如何新增設定,以及如何確保該設定已正確編入索引 搜尋設定。

可建立索引的設定

需要建立索引的每個設定片段都會導入 Indexable介面,且需要 欄位:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

設定要建立索引的片段後,請將片段新增至 在以下位置找到 SearchIndexableResources
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

選擇性方法

這個SearchIndexProvider介面有四個選用介面 方法。

getXmlResourcesToIndex

  • 如果片段內容來自:preference xml,請覆寫這項設定
  • 以清單形式傳回要建立索引的 XML 偏好設定。

XML 資源範例:

public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {
    ArrayList<SearchIndexableResource> result =  new ArrayList<SearchIndexableResource>();
SearchIndexableResource sir = new SearchIndexableResource(context);
	sir.xmlResId = R.xml.display_settings;
	result.add(sir);

    return result;
}

getRawDataToIndex

  • 如果片段內容「不是」來自 preference xml,請覆寫這項設定
  • 傳回要建立索引的原始資料 (SearchIndexableRaw) 清單。

原始資料範例:

public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
              final List<SearchIndexableRaw> result = new ArrayList<>();
              final Resources res = context.getResources();

              // Add fragment title
       SearchIndexableRaw data = new SearchIndexableRaw(context);
       data.title = res.getString(R.string.wifi_settings);
       data.screenTitle = res.getString(R.string.wifi_settings);
       data.keywords = res.getString(R.string.keywords_wifi);
       data.key = DATA_KEY_REFERENCE;
       result.add(data);

       return result;
}

getNonIndexableKeys

  • 如果片段是 DashboardFragment,您很少需要 則會覆寫此值
  • 傳回對應於不應顯示結果的鍵清單 (適用於指定使用者、裝置、設定等) 的金鑰 與 SearchIndexableResource 中的 KEY 欄位相符,且 SearchIndexableRaw
  • 舉例來說,如果使用者從未登入裝置,系統就不會顯示他們的「數據用量」 SIM 卡。

無法建立索引的鍵範例:

public List<String> getNonIndexableKeys(Context context) {
      final List<String> keys = super.getNonIndexableKeys(context);
              if (!checkIntentAction(context, "android.settings.TERMS")) {
                  keys.add(KEY_TERMS);
              }
              if (!checkIntentAction(context, "android.settings.LICENSE")) {
                  keys.add(KEY_LICENSE);
              }
              if (!checkIntentAction(context, "android.settings.COPYRIGHT")) {
                  keys.add(KEY_COPYRIGHT);
              }
              if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) {
                  keys.add(KEY_WEBVIEW_LICENSE);
              }
              return keys;
}

getPreferenceControllers

傳回與此片段相關聯的偏好設定控制器清單。 這份清單可用於建立內嵌結果、更新無法建立索引的結果等。

因此,你要顯示在搜尋結果中的所有內容都必須加入 getXmlResourcesToIndexgetRawDataToIndex

根據設定新增關鍵字

為確保設定方便搜尋,請新增與 設定,供使用者搜尋設定。

新增關鍵字的注意事項:

  • 關鍵字是使用者不一定會看到的字詞清單 也別忘了在心理模型中
  • 也就是使用者為前往您設定輸入的字詞。
  • 可以是同義詞或任何與設定相關聯的字詞。
  • 例如「mute」找到「音量」設定

避免重複

如果你無條件略過設定頁面,請移除 原始網頁,以免產生重複結果。

  1. 找出你要隱藏的網頁 PreferenceFragment
  2. 移除 SearchIndexProvider

驗證

如何測試新設定的可搜尋性:

  1. 將裝置上的 O 安裝至最新版本。
  2. 選取下列項目,以便重新為資料庫建立索引:
  3. 設定 >應用程式與通知 >應用程式資訊 >設定 >儲存空間 > 清除資料
  4. 確認搜尋結果能夠顯示目標設定。
    搜尋設定標題的前置字串,將可找出這項設定。

系統可能會執行這些 robolectric 測試,驗證是否實作 地圖項目:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

建構目標為:RunSettingsRoboTests