Универсальный поиск

В Android 8.0 добавлены расширенные возможности поиска в меню « Настройки ». В этом документе описывается, как добавить настройку и убедиться, что она правильно проиндексирована для поиска настроек.

Создание индексируемых настроек

Каждый фрагмент настроек, который необходимо проиндексировать, реализует Indexable интерфейс И требует статического поля:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

После того, как вы настроили свой фрагмент для индексации, добавьте его в SearchIndexableResources , который находится по адресу:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Дополнительные методы

Этот интерфейс SearchIndexProvider имеет четыре необязательных метода.

жетксмлресурсестоиндекс

  • Переопределите это, если содержимое вашего фрагмента взято из: 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;
}

жетравдататоиндекс

  • Переопределите это, если содержимое вашего фрагмента НЕ из: 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 .

Добавление ключевых слов для ваших настроек

Чтобы параметр был легко доступен для поиска, добавьте ключевые слова, релевантные для параметра, которые пользователь может использовать для поиска параметра.

Что нужно учитывать при добавлении ключевых слов:

  • Ключевые слова — это список слов, которые пользователь не обязательно видит, но может быть частью его мысленной модели того, как работает настройка.
  • Это слова, которые пользователь может ввести, чтобы перейти к вашим настройкам.
  • Они могут быть синонимами или могут использоваться любые слова, связанные с настройкой.
  • Например, «отключить звук» можно использовать для поиска настройки громкости.

Избегайте дублирования

Если вы безоговорочно подавляете страницу настроек, удалите индексацию исходной страницы, чтобы избежать дублирования результатов.

  1. Найдите PreferenceFragment страницы, которую вы подавляете.
  2. Удалите SearchIndexProvider .

Проверка

Чтобы проверить возможность поиска новой настройки:

  1. Установите последнюю версию O на устройство.
  2. Переиндексируйте базу данных, выбрав:
  3. Настройки > Приложения и уведомления > Информация о приложениях > Настройки > Хранилище > Очистить данные
  4. Убедитесь, что целевые настройки отображаются в поиске.
    Поиск префикса названия настройки будет соответствовать ему.

Эти робоэлектрические тесты могут быть запущены для проверки реализации этой функции:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

Цель сборки: RunSettingsRoboTests .