В 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