В 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.
- Переиндексируйте базу данных, выбрав: Настройки > Приложения и уведомления > Информация о приложениях > Настройки > Хранилище >Удалить данные
- Проверьте, отображаются ли целевые настройки в результатах поиска.
При поиске по префиксу названия настройки будет найдена эта настройка.
Эти тесты Robolectric можно запустить, чтобы проверить реализацию функции:
packages/apps/Settings/tests/robotests/src/com/android/settings/search
Цель сборки: RunSettingsRoboTests