В 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, вам редко придется переопределять это. - Возвращает список ключей, соответствующих результатам, которые не должны отображаться для данного пользователя, устройства, конфигурации и т. д. Предоставленные здесь ключи должны соответствовать полю KEY в
SearchIndexableResourceи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
Возвращает список контроллеров предпочтений, связанных с этим фрагментом. Этот список используется для формирования встроенных результатов, обновления неиндексируемых объектов и т. д.
Таким образом, все, что вы хотите отобразить в поиске, должно быть включено либо в getXmlResourcesToIndex , либо getRawDataToIndex .
Добавьте ключевые слова для своих настроек
Чтобы обеспечить удобство поиска параметра, добавьте ключевые слова, относящиеся к параметру, которые пользователь может использовать для поиска параметра.
Что следует учитывать при добавлении ключевых слов:
- Ключевые слова — это список слов, которые пользователь не обязательно видит, но которые могут быть частью его мысленной модели того, как работает настройка.
- Это слова, которые пользователь может ввести, чтобы перейти к вашим настройкам.
- Они могут быть синонимами или могут использоваться любые слова, связанные с параметром.
- Например, «без звука» можно использовать для поиска настройки громкости.
Избегайте дублирования
Если вы безоговорочно подавляете страницу настроек, удалите индексацию исходной страницы, чтобы избежать дублирования результатов.
- Найдите
PreferenceFragmentстраницы, которую вы подавляете. - Удалите
SearchIndexProvider.
Валидация
Чтобы проверить возможность поиска новой настройки:
- Установите на устройство последнюю версию O.
- Переиндексируйте базу данных, выбрав: Настройки > Приложения и уведомления > Информация о приложениях > Настройки > Память > Очистить данные.
- Убедитесь, что целевые настройки отображаются в поиске.
Поиск префикса названия параметра будет соответствовать ему.
Для проверки реализации этой функции можно запустить следующие робоэлектрические тесты:
packages/apps/Settings/tests/robotests/src/com/android/settings/search
Цель сборки: RunSettingsRoboTests