Android 8.0 には、設定メニューの拡張検索機能が追加されています。このドキュメントでは、設定を追加する方法と、設定を検索したときにそれが確実に見つかるように適切にインデックス登録する方法を説明します。
インデックス登録できる設定を作成する
インデックス登録が必要な各設定フラグメントは Indexable
インターフェースを実装します。さらに、次の静的項目を必要とします。
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
インデックス登録用にフラグメントを設定したら、以下の場所にある SearchIndexableResources
に追加します。
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java
オプションのメソッド
この SearchIndexProvider
インターフェースにはオプションのメソッドが 4 つあります。
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
とSearchIndexableRaw
の KEY 項目に一致する必要があります。 - たとえば、デバイスに 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
このフラグメントに関連付けられた設定コントローラのリストが返されます。 このリストは、インライン結果の作成や、インデックス登録できないデータの更新などに使用されます。
したがって、検索結果に表示するデータはすべて getXmlResourcesToIndex
または getRawDataToIndex
に含める必要があります。
設定用のキーワードを追加する
設定を簡単に検索できるようにするには、ユーザーが検索に使用できる、設定に関連したキーワードを追加します。
キーワードを追加する際の注意事項:
- キーワードは、ユーザーに表示されるとは限りませんが、設定の機能に関する心理モデルに含まれている可能性がある単語のリストです。
- ユーザーはこれらの単語を入力して設定にアクセスできます。
- 類義語も指定でき、設定に関連するあらゆる単語を使用可能です。
- たとえば、「ミュート」は [音量] 設定の検索に使用できます。
重複を回避する
設定ページを無条件に抑制する場合は、元のページのインデックス登録を削除して、結果が重複しないようにします。
- 抑制するページの
PreferenceFragment
を見つけます。 SearchIndexProvider
を削除します。
検証
新しい設定の検索可能性をテストするには:
- デバイスに O の最新バージョンをインストールします。
- 次のとおりに選択して、データベースをインデックスに再登録します。 [設定] > [アプリと通知] > [アプリ情報] > [設定] > [ストレージ] > [データを消去]
- ターゲット設定が検索結果に表示されることを確認します。
設定のタイトルのプレフィックスを検索すると、一致します。
次の robolectric テストを実施して、この機能の実装を検証できます。
packages/apps/Settings/tests/robotests/src/com/android/settings/search
ビルド ターゲット: RunSettingsRoboTests