Когда вы будете готовы добавить в приложение функцию поиска, Android поможет вам реализовать пользовательский интерфейс с помощью диалогового окна поиска, которое появляется в верхней части окна действия, или виджета поиска, который можно вставить в макет. И диалоговое окно, и виджет могут передавать поисковый запрос пользователя определенному действию в приложении. Таким образом, пользователь может начать поиск из любого действия, в котором доступно диалоговое окно или виджет, а система запустит соответствующее действие для выполнения поиска и представления результатов.
Другие функции, доступные для диалогового окна и виджета поиска:
- Голосовой поиск
- Подсказки при поиске на основе недавних запросов
- Подсказки при поиске, которые соответствуют фактическим результатам в данных приложения.
В этом документе показано, как настроить приложение для предоставления интерфейса поиска, которому помогает система Android доставлять поисковые запросы, используя либо диалоговое окно поиска, либо виджет поиска.
Информация по теме
Основные сведения
Прежде чем начать, решите, как вы хотите реализовать интерфейс поиска: с помощью диалогового окна или виджета. Они предоставляют одинаковые функции поиска, но работают по-разному:
- Диалоговое окно поиска – это компонент пользовательского интерфейса, управляемый системой Android. Когда пользователь активирует поиск, в верхней части экрана появляется диалоговое окно.
Система Android управляет всеми событиями в диалоговом окне поиска. Когда пользователь отправляет запрос, система передает его в объект activity, который вы указали для обработки поисковых запросов. В диалоговом окне также могут появляться подсказки по мере ввода запроса.
- Виджет поиска – это экземпляр
SearchView, который можно разместить в любом месте макета. По умолчанию виджет поиска работает как стандартный виджетEditTextи ничего не делает, но вы можете настроить его так, чтобы система Android обрабатывала все события ввода, передавала запросы в соответствующее действие и предоставляла подсказки при поиске, как и в случае с диалоговым окном поиска.
Когда пользователь выполняет поиск в диалоговом окне или виджете, система создает объект Intent и сохраняет в нем запрос. Затем система запускает действие, которое вы объявили для обработки поисковых запросов (действие с возможностью поиска), и передает ему намерение. Чтобы настроить приложение для такого поиска, вам потребуется:
- Конфигурация поиска
- XML-файл, в котором задаются некоторые настройки диалогового окна или виджета поиска. В частности, вы можете настроить голосовой поиск, подсказки при поиске и текст подсказки в окне поиска.
- Действие, которое можно найти
Activity, который получает поисковый запрос, ищет данные и показывает результаты поиска.- Интерфейс поиска, предоставляемый одним из следующих способов:
- Диалоговое окно поиска
- По умолчанию диалоговое окно поиска скрыто. Она появляется в верхней части экрана, когда вы вызываете
onSearchRequested()после нажатия пользователем кнопки Поиск.- Виджет
SearchView- Виджет поиска позволяет разместить окно поиска в любом месте действия, в том числе в виде действия на панели приложения.
- Виджет
В оставшейся части этого документа показано, как создать конфигурацию поиска и действия с возможностью поиска, а также как реализовать интерфейс поиска с помощью диалогового окна поиска или виджета поиска.
Как создать конфигурацию с возможностью поиска
Сначала вам понадобится XML-файл, который называется конфигурацией поиска.
Он настраивает определенные аспекты пользовательского интерфейса диалогового окна или виджета поиска и определяет, как ведут себя такие функции, как подсказки и голосовой поиск. Обычно этот файл называется searchable.xml и должен быть сохранен в каталоге проекта res/xml/.
Файл конфигурации поиска должен содержать элемент <searchable> в качестве корневого узла и один или несколько атрибутов, как показано в примере ниже.
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint" > </searchable>
Обязательным является только атрибут android:label. Он указывает на строковый ресурс, который должен быть названием приложения. Этот ярлык не виден пользователю, пока вы не включите подсказки при поиске для окна быстрого поиска. После этого ярлык появится в списке объектов, доступных для поиска, в системных настройках.
Хотя это и не обязательно, мы рекомендуем всегда добавлять атрибут android:hint, который позволяет показывать в окне поиска подсказку, пока пользователь не ввел запрос. Подсказка важна, потому что она дает пользователям важные подсказки о том, что они могут искать.
Элемент <searchable> принимает несколько других атрибутов.
Однако большинство атрибутов не требуется, пока вы не добавите такие функции, как подсказки при поиске и голосовой поиск. Подробную информацию о файле конфигурации поиска можно найти в справочном документе.
Как создать действие, доступное для поиска
Доступное для поиска действие – это Activity в приложении, которое выполняет поиск на основе строки запроса и представляет результаты поиска.
Когда пользователь выполняет поиск в диалоговом окне или виджете, система запускает действие с поддержкой поиска и передает ему поисковый запрос в объекте Intent с действием ACTION_SEARCH. Ваше действие с возможностью поиска извлекает запрос из дополнительного параметра QUERY намерения, а затем выполняет поиск по вашим данным и представляет результаты.
Поскольку вы можете включить диалоговое окно поиска или виджет в любое другое действие в своем приложении, система должна знать, какое действие является вашим действием с возможностью поиска, чтобы она могла правильно доставить поисковый запрос. Итак, сначала объявите свою поисковую активность в файле манифеста Android.
Как объявить действие, доступное для поиска
Если у вас ещё нет Activity, создайте его. Он будет выполнять поиск и показывать результаты. Реализовывать функцию поиска пока не нужно – просто создайте действие, которое можно объявить в манифесте. Внутри элемента <activity> выполните следующие действия:
- Объявите, что объект activity принимает намерение
ACTION_SEARCHв элементе<intent-filter>. - Укажите конфигурацию поиска в элементе
<meta-data>.
Это показано в следующем примере:
<application ... > <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> ... </application>
Элемент <meta-data> должен включать атрибут android:name со значением "android.app.searchable" и атрибут android:resource со ссылкой на файл конфигурации поиска. В примере выше это файл res/xml/searchable.xml.
Выполните поиск.
После объявления действия с возможностью поиска в манифесте выполните следующую процедуру, чтобы выполнить поиск в действии с возможностью поиска:
Получение запроса
Когда пользователь выполняет поиск в диалоговом окне или виджете, система запускает операцию поиска и отправляет ей намерение ACTION_SEARCH. Этот интент содержит поисковый запрос в строке QUERY. Проверьте наличие этого намерения при запуске действия и извлеките строку.
Например, вот как можно получить поисковый запрос при запуске действия с возможностью поиска:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) // Verify the action and get the query. if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); // Get the intent, verify the action, and get the query. Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
Строка QUERY всегда включается в намерение ACTION_SEARCH. В примере выше запрос извлекается и передается локальному методу doMySearch(), который выполняет поиск.
Поиск по вашим данным
Процесс хранения и поиска данных уникален для каждого приложения. Существует множество способов хранения и поиска данных, и в этом документе они не рассматриваются. Подумайте о том, как вы храните и ищете свои данные с точки зрения ваших потребностей и формата ваших данных. Вот несколько советов, которые могут вам помочь:
- Если данные хранятся в базе данных SQLite на устройстве, полнотекстовый поиск с использованием FTS3, а не запроса
LIKE, может обеспечить более надежный поиск по текстовым данным и значительно ускорить получение результатов. Информацию о FTS3 можно найти на сайте sqlite.org, а о SQLite на Android – в описании классаSQLiteDatabase. - Если данные хранятся в интернете, то скорость поиска может зависеть от качества подключения к сети. Пока выполняется поиск, вы можете показывать индикатор выполнения. Дополнительную информацию можно найти в
android.netиProgressBar.
Представьте результаты
Независимо от того, где хранятся ваши данные и как вы выполняете поиск по ним, мы рекомендуем возвращать результаты поиска в действие с возможностью поиска с помощью Adapter. Таким образом, вы можете представить все результаты поиска в RecyclerView.
Если данные поступают из запроса к базе данных SQLite, вы можете применить результаты к RecyclerView с помощью CursorAdapter.
Если ваши данные представлены в другом формате, вы можете создать расширение BaseAdapter.
Adapter связывает каждый элемент из набора данных с объектом View. Когда Adapter применяется к RecyclerView, каждый фрагмент данных вставляется в список как отдельное представление. Adapter – это просто интерфейс, поэтому необходимы реализации, такие как CursorAdapter, для привязки данных из Cursor. Если ни одна из существующих реализаций не подходит для ваших данных, вы можете реализовать собственную на основе BaseAdapter.
Как использовать диалоговое окно поиска
Диалоговое окно поиска представляет собой плавающее окно поиска в верхней части экрана со значком приложения слева. Диалоговое окно поиска может предлагать подсказки по мере ввода. Когда пользователь выполняет поиск, система отправляет поисковый запрос в действие с возможностью поиска, которое выполняет поиск.
По умолчанию диалоговое окно поиска скрыто, пока пользователь не активирует его.
Приложение может активировать диалоговое окно поиска, вызвав метод onSearchRequested(). Однако этот метод не будет работать, пока вы не включите диалоговое окно поиска для действия.
Чтобы включить диалоговое окно поиска для выполнения поиска, укажите системе, какое действие с возможностью поиска должно получать поисковые запросы из диалогового окна поиска. Например, в предыдущем разделе, посвященном созданию действия с возможностью поиска, создается действие с возможностью поиска под названием SearchableActivity. Если вы хотите, чтобы диалоговое окно поиска показывалось в отдельном объекте activity, например OtherActivity, а результаты поиска передавались в SearchableActivity, укажите в манифесте, что SearchableActivity – это объект activity с возможностью поиска, который будет использоваться для диалогового окна поиска в OtherActivity.
Чтобы объявить объект activity, доступный для поиска, в диалоговом окне поиска объекта activity, добавьте элемент <meta-data> в элемент <activity> соответствующего объекта activity. Элемент <meta-data> должен включать атрибут android:value, который указывает название класса действия, доступного для поиска, и атрибут android:name со значением "android.app.default_searchable".
Например, ниже приведено объявление как для действия с возможностью поиска (SearchableActivity), так и для другого действия (OtherActivity), которое использует SearchableActivity для выполнения поиска из своего диалогового окна поиска:
<application ... > <!-- This is the searchable activity; it performs searches. --> <activity android:name=".SearchableActivity" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> <!-- This activity enables the search dialog to initiate searches in the SearchableActivity. --> <activity android:name=".OtherActivity" ... > <!-- Enable the search dialog to send searches to SearchableActivity. --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableActivity" /> </activity> ... </application>
Поскольку файл OtherActivity теперь содержит элемент <meta-data>, объявляющий, какое действие использовать для поиска, это действие активирует диалоговое окно поиска. Хотя пользователь находится в этом действии, метод onSearchRequested() активирует диалоговое окно поиска. Когда пользователь выполняет поиск, система запускает SearchableActivity и передает ему намерение ACTION_SEARCH.
Если вы хотите, чтобы окно поиска было доступно во всех действиях приложения, вставьте элемент <meta-data> в элемент <application>, а не в каждый элемент <activity>. Таким образом, каждое действие наследует значение, предоставляет диалоговое окно поиска и доставляет результаты поиска в одно и то же действие с возможностью поиска. Если у вас несколько действий с возможностью поиска, вы можете переопределить действие по умолчанию, поместив другое объявление <meta-data> в отдельные действия.
Теперь, когда диалоговое окно поиска включено для ваших действий, ваше приложение готово к выполнению поиска.
Вызов диалогового окна поиска
Хотя на некоторых устройствах есть специальная кнопка поиска, ее поведение может различаться в зависимости от устройства, а на многих устройствах кнопка поиска вообще отсутствует. Поэтому при использовании диалогового окна поиска вы должны предоставить кнопку поиска в своем пользовательском интерфейсе, которая активирует диалоговое окно поиска, вызывая onSearchRequested().
Например, добавьте кнопку поиска в меню параметров или макет пользовательского интерфейса, который вызывает onSearchRequested().
Вы также можете включить функцию "поиск по мере ввода", которая активирует диалоговое окно поиска, когда пользователь начинает вводить текст на клавиатуре. Нажатия клавиш вставляются в диалоговое окно поиска. Чтобы включить поиск по мере ввода, вызовите метод setDefaultKeyMode или DEFAULT_KEYS_SEARCH_LOCAL в методе onCreate().
Влияние диалогового окна поиска на жизненный цикл объекта activity
Окно поиска – это Dialog, которое появляется в верхней части экрана. Это не приводит к изменениям в стеке объектов activity, поэтому при появлении диалогового окна поиска не вызываются методы жизненного цикла, такие как onPause(). Ваше действие теряет фокус ввода, поскольку фокус ввода передается диалоговому окну поиска.
Если вы хотите получать уведомления об активации диалогового окна поиска, переопределите метод onSearchRequested(). Когда система вызывает этот метод, это означает, что ваше действие теряет фокус ввода в диалоговом окне поиска, поэтому вы можете выполнить любую работу, соответствующую событию, например приостановить игру. Если вы не передаете контекстные данные поиска (этот вопрос рассматривается в другом разделе документа), завершите метод, вызвав реализацию надкласса:
Kotlin
override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() }
Java
@Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
Если пользователь отменяет поиск, нажав кнопку "Назад", диалоговое окно поиска закрывается, а фокус ввода возвращается к действию. Вы можете зарегистрироваться, чтобы получать уведомления о закрытии диалогового окна поиска с помощью setOnDismissListener(), setOnCancelListener() или обоих способов. Вам нужно зарегистрировать только OnDismissListener, потому что он вызывается каждый раз, когда закрывается диалоговое окно поиска. Метод OnCancelListener относится только к событиям, в которых пользователь явно выходит из диалогового окна поиска, поэтому он не вызывается при выполнении поиска. Когда поиск выполнен, диалоговое окно поиска автоматически исчезает.
Если текущий объект activity не является объектом activity с возможностью поиска, то при выполнении поиска пользователем запускаются обычные события жизненного цикла объекта activity. Текущий объект activity получает onPause(), как описано в статье о работе с объектами activity. Однако если текущее действие является действием с возможностью поиска,
тогда происходит одно из двух:
- По умолчанию объект activity, в котором выполняется поиск, получает намерение
ACTION_SEARCHс вызовомonCreate(), а новый экземпляр этого объекта помещается в верхнюю часть стека объектов activity. В стеке объектов activity теперь два экземпляра действия с возможностью поиска, поэтому при нажатии кнопки "Назад" вы вернетесь к предыдущему экземпляру, а не выйдете из действия. - Если для атрибута
android:launchModeзадано значение"singleTop", то объект activity, поддерживающий поиск, получает намерениеACTION_SEARCHс вызовом методаonNewIntent(Intent), передавая новое намерениеACTION_SEARCH. Например, вот как можно обработать случай, когда для действия, поддерживающего поиск, задан режим запуска"singleTop":Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) handleIntent(intent) } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
По сравнению с примером кода в разделе Выполнение поиска, весь код для обработки поискового намерения теперь находится в методе
handleIntent(), поэтому его могут выполнять иonCreate(), иonNewIntent().Когда система вызывает
onNewIntent(Intent), объект activity не перезапускается, поэтому методgetIntent()возвращает тот же объект intent, который получен с помощьюonCreate(). Поэтому необходимо вызватьsetIntent(Intent)внутриonNewIntent(Intent), чтобы намерение, сохраненное действием, обновлялось при вызовеgetIntent()в будущем.
Второй сценарий с использованием режима запуска "singleTop" обычно предпочтительнее, поскольку после выполнения поиска пользователь может выполнить дополнительные поисковые запросы, и вы не хотите, чтобы ваше приложение создавало несколько экземпляров действия с возможностью поиска. Рекомендуем задать для действия с возможностью поиска режим запуска "singleTop" в манифесте приложения, как показано в примере ниже.
<activity android:name=".SearchableActivity" android:launchMode="singleTop" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity>
Передача контекстных данных поиска
В некоторых случаях вы можете уточнить поисковый запрос в действии с возможностью поиска для каждого выполненного поиска. Однако если вы хотите уточнить критерии поиска на основе действия, из которого пользователь выполняет поиск, вы можете предоставить дополнительные данные в намерении, которое система отправляет в ваше действие с возможностью поиска. Дополнительные данные можно передавать в объекте APP_DATA
Bundle, который включен в намерение ACTION_SEARCH.
Чтобы передать такие данные в операцию с возможностью поиска, переопределите метод onSearchRequested() для операции, из которой пользователь может выполнить поиск, создайте объект Bundle с дополнительными данными и вызовите метод startSearch(), чтобы активировать диалоговое окно поиска. Пример:
Kotlin
override fun onSearchRequested(): Boolean { val appData = Bundle().apply { putBoolean(JARGON, true) } startSearch(null, false, appData, false) return true }
Java
@Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; }
Значение true указывает, что вы успешно обработали это событие обратного вызова и вызвали startSearch(), чтобы активировать диалоговое окно поиска. После того как пользователь отправит запрос, он будет передан в ваше действие с возможностью поиска вместе с добавленными вами данными. Чтобы уточнить поиск, вы можете извлечь дополнительные данные из APP_DATA
Bundle, как показано в примере ниже.
Kotlin
val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false
Java
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA); if (appData != null) { boolean jargon = appData.getBoolean(SearchableActivity.JARGON); }
Как использовать виджет Поиска
Рисунок 1. SearchViewВиджет в качестве представления действия на панели приложения.
Виджет поиска предоставляет те же функции, что и диалоговое окно поиска. Он запускает соответствующее действие, когда пользователь выполняет поиск, и может предоставлять подсказки при поиске и выполнять голосовой поиск. Если вы не можете поместить виджет поиска на панель приложения, вы можете поместить его в любое место макета активности.
Как настроить виджет Поиска
После создания конфигурации поиска и операции с возможностью поиска включите вспомогательный поиск для каждого объекта SearchView, вызвав метод setSearchableInfo() и передав ему объект SearchableInfo, который представляет вашу конфигурацию с возможностью поиска.
Чтобы получить ссылку на SearchableInfo, вызовите getSearchableInfo() в SearchManager.
Например, если вы используете SearchView в качестве представления действия на панели приложения, включите виджет во время обратного вызова onCreateOptionsMenu(), как показано в следующем примере:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the options menu from XML. val inflater = menuInflater inflater.inflate(R.menu.options_menu, menu) // Get the SearchView and set the searchable configuration. val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager (menu.findItem(R.id.menu_search).actionView as SearchView).apply { // Assumes current activity is the searchable activity. setSearchableInfo(searchManager.getSearchableInfo(componentName)) setIconifiedByDefault(false) // Don't iconify the widget. Expand it by default. } return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the options menu from XML. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); // Get the SearchView and set the searchable configuration. SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // Assumes current activity is the searchable activity. searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Don't iconify the widget. Expand it by default. return true; }
Виджет поиска настроен, и система передает поисковые запросы в ваше действие с возможностью поиска. Вы также можете включить подсказки при поиске для виджета Поиска.
Подробную информацию о представлениях действий на панели приложения можно найти в статье Использование представлений действий и поставщиков действий.
Другие функции виджета Поиска
Виджет SearchView предоставляет несколько дополнительных функций, которые могут вам пригодиться:
- кнопка отправки;
- По умолчанию кнопки для отправки поискового запроса нет, поэтому пользователю нужно нажать клавишу Ввод на клавиатуре. Вы можете добавить кнопку отправки, вызвав
setSubmitButtonEnabled(true). - Уточнение запроса для подсказок при поиске
- Обычно пользователи выбирают подсказку, но иногда они хотят уточнить предложенный поисковый запрос.
Вы можете добавить рядом с каждой подсказкой кнопку, которая вставляет подсказку в окно поиска, чтобы пользователь мог ее уточнить. Для этого вызовите
setQueryRefinementEnabled(true). - возможность включать и отключать показ окна поиска;
- По умолчанию виджет поиска представлен в виде значка лупы. При нажатии на значок открывается окно поиска. Как показано в примере выше, вы можете сделать так, чтобы окно поиска показывалось по умолчанию, вызвав метод
setIconifiedByDefault(false). Вы также можете переключать внешний вид виджета поиска, вызываяsetIconified().
В классе SearchView есть и другие API, позволяющие настраивать виджет поиска. Однако большинство из них используется только в том случае, если вы обрабатываете все вводимые пользователем данные самостоятельно, а не используете систему Android для доставки поисковых запросов и отображения подсказок при поиске.
Используйте и виджет, и диалоговое окно
Если вы вставите виджет поиска в панель приложения как представление действия и разрешите ему появляться на панели приложения, если есть место (задав android:showAsAction="ifRoom"), то виджет поиска может не отображаться как представление действия. Вместо этого пункт меню может появиться в дополнительном меню. Например, если приложение запущено на небольшом экране, на панели приложения может не хватить места для виджета поиска и других элементов навигации или задач. В этом случае виджет будет показан в дополнительном меню. При размещении в дополнительном меню элемент работает как обычный элемент меню и не отображает представление действия, то есть виджет поиска.
Чтобы справиться с этой ситуацией, пункт меню, к которому вы прикрепляете виджет поиска, должен активировать диалоговое окно поиска, когда пользователь выбирает его из дополнительного меню.
Для этого реализуйте метод onOptionsItemSelected(), который будет обрабатывать нажатие на пункт меню "Поиск" и открывать диалоговое окно поиска с помощью вызова onSearchRequested().
Подробнее о том, как работают элементы на панели приложения и как решить эту проблему, рассказывается в статье Как добавить панель приложения.
Добавить голосовой поиск
Чтобы добавить функцию голосового поиска в диалоговое окно или виджет, добавьте атрибут android:voiceSearchMode в конфигурацию поиска. Добавляет кнопку голосового поиска, которая запускает голосовую подсказку.
Когда пользователь закончит говорить, расшифрованный поисковый запрос будет отправлен в ваше действие с возможностью поиска.
Это показано в следующем примере:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" > </searchable>
Чтобы включить голосовой поиск, необходимо значение showVoiceSearchButton. Второе значение, launchRecognizer, указывает, что кнопка голосового поиска должна запускать распознаватель, который возвращает расшифрованный текст в действие с возможностью поиска.
Вы можете указать дополнительные атрибуты, чтобы настроить поведение голосового поиска, например ожидаемый язык и максимальное количество возвращаемых результатов. Дополнительную информацию о доступных атрибутах можно найти в справочнике Конфигурация поиска.
Добавить подсказки при поиске
И диалоговое окно поиска, и виджет поиска могут предлагать подсказки при поиске по мере ввода запроса пользователем. Это происходит при содействии системы Android. Система управляет списком подсказок и обрабатывает событие, когда пользователь выбирает подсказку.
Вы можете предоставить два типа подсказок при поиске:
- Подсказки на основе недавних запросов
- Эти подсказки представляют собой слова, которые пользователь ранее использовал в качестве поисковых запросов в вашем приложении. Дополнительную информацию см. в разделе Добавление пользовательских подсказок при поиске.
- Персонализированные подсказки при поиске
- Это подсказки при поиске, которые вы предоставляете из собственного источника данных, чтобы помочь пользователям сразу выбрать правильное написание или товар, который они ищут. Подробнее о том, как добавить собственные подсказки при поиске…