Когда вы будете готовы добавить функцию поиска в своё приложение, Android поможет вам реализовать пользовательский интерфейс с помощью диалогового окна поиска, которое отображается в верхней части окна активности, или поискового виджета, который можно вставить в макет. Как диалоговое окно поиска, так и виджет могут направлять поисковый запрос пользователя к определённому активному элементу в вашем приложении. Таким образом, пользователь может начать поиск из любого активного элемента, где доступен диалоговое окно поиска или виджет, а система запустит соответствующее активное элемент для выполнения поиска и отображения результатов.
Другие функции, доступные для диалогового окна поиска и виджета, включают:
- Голосовой поиск
- Поисковые предложения на основе недавних запросов
- Поисковые предложения, соответствующие фактическим результатам в данных вашего приложения
В этом документе показано, как настроить приложение для предоставления интерфейса поиска, с помощью которого система Android будет выполнять поисковые запросы, используя либо диалоговое окно поиска, либо виджет поиска.
Связанные ресурсы:
Основы
Прежде чем начать, определитесь, хотите ли вы реализовать поисковый интерфейс с помощью диалогового окна поиска или виджета поиска. Они предоставляют те же функции поиска, но немного по-разному:
- Диалог поиска — это компонент пользовательского интерфейса, управляемый системой Android. При активации пользователем диалог поиска появляется в верхней части активности.
Система Android управляет всеми событиями в диалоговом окне поиска. Когда пользователь отправляет запрос, система передаёт его в указанное вами действие для обработки поисковых запросов. Диалог также может предлагать подсказки по мере ввода текста пользователем.
- Виджет поиска — это экземпляр
SearchView
, который можно разместить в любом месте макета. По умолчанию виджет поиска ведёт себя как стандартный виджетEditText
и не выполняет никаких действий, но вы можете настроить его так, чтобы система Android обрабатывала все события ввода, отправляла запросы в соответствующую активность и предлагала поисковые подсказки — точно так же, как диалоговое окно поиска.
Когда пользователь выполняет поиск из диалогового окна поиска или поискового виджета, система создаёт Intent
и сохраняет в нём запрос пользователя. Затем система запускает действие, которое вы объявили для обработки поисковых запросов (так называемое «searchable activity»), и отправляет ему намерение. Чтобы настроить приложение для такого типа вспомогательного поиска, вам потребуется следующее:
- Конфигурация поиска
- 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
. Проверьте наличие этого намерения при запуске активности и извлеките строку. Например, вот как можно получить поисковый запрос при запуске вашей поисковой активности:
Котлин
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) } } }
Ява
@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 , а информацию о классеSQLiteDatabase
— на сайте SQLite для Android. - Если ваши данные хранятся онлайн, то воспринимаемая производительность поиска может быть ограничена подключением пользователя к Интернету. Возможно, вам стоит отображать индикатор выполнения до тех пор, пока поиск не будет выполнен. См.
android.net
для получения справки о сетевых API иProgressBar
для получения информации о том, как отображать индикатор выполнения.
Представить результаты
Независимо от того, где находятся ваши данные и как вы их ищете, мы рекомендуем возвращать результаты поиска в вашу поисковую активность с помощью Adapter
. Таким образом, вы можете представить все результаты поиска в RecyclerView
. Если данные получены из запроса к базе данных SQLite, вы можете применить их к RecyclerView
с помощью CursorAdapter
. Если ваши данные представлены в другом формате, вы можете создать расширение BaseAdapter
.
Adapter
привязывает каждый элемент из набора данных к объекту View
. При применении Adapter
к RecyclerView
каждый элемент данных вставляется в список как отдельное представление. Adapter
— это всего лишь интерфейс, поэтому необходимы реализации, такие как CursorAdapter
, для привязки данных из Cursor
. Если ни одна из существующих реализаций не подходит для ваших данных, вы можете реализовать свою собственную с помощью BaseAdapter
.
Используйте диалог поиска
Диалог поиска представляет собой плавающее поле поиска в верхней части экрана со значком приложения слева. Диалог поиска может предлагать подсказки по мере ввода текста пользователем. Когда пользователь выполняет поиск, система отправляет поисковый запрос в доступное для поиска действие, которое и выполняет поиск.
По умолчанию диалоговое окно поиска всегда скрыто, пока пользователь его не активирует. Ваше приложение может активировать диалоговое окно поиска, вызвав onSearchRequested()
. Однако этот метод не будет работать, пока диалоговое окно поиска не будет включено для активности.
Чтобы диалог поиска выполнял поиск, укажите системе, какая поисковая активность должна получать поисковые запросы из диалога поиска. Например, в предыдущем разделе о создании поисковой активности была создана поисковая активность с именем SearchableActivity
. Если вы хотите, чтобы отдельная активность, например, с именем OtherActivity
, отображала диалог поиска и передавала результаты поиска в SearchableActivity
, укажите в манифесте, что SearchableActivity
— это поисковая активность, которая будет использоваться для диалога поиска в OtherActivity
.
Чтобы объявить активность с возможностью поиска для диалогового окна поиска активности, добавьте элемент <meta-data>
внутрь элемента <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()
вашей активности.
Влияние диалога поиска на жизненный цикл вашей активности
Диалог поиска — это плавающий Dialog
, расположенный в верхней части экрана. Он не вызывает никаких изменений в стеке действий, поэтому при его появлении не вызываются методы жизненного цикла, такие как onPause()
. Действие теряет фокус ввода, поскольку фокус ввода переходит к диалогу поиска.
Если вы хотите получать уведомления при активации диалогового окна поиска, переопределите метод onSearchRequested()
. Вызов этого метода системой означает, что ваша активность теряет фокус ввода на диалоговое окно поиска, и вы можете выполнять любые действия, соответствующие событию, например, приостановить игру. Если вы не передаёте данные контекста поиска (обсуждаемые в другом разделе этого документа), завершите метод вызовом реализации суперкласса:
Котлин
override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() }
Ява
@Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
Если пользователь отменяет поиск, нажав кнопку «Назад», диалоговое окно поиска закрывается, и Activity снова получает фокус ввода. Вы можете зарегистрироваться, чтобы получать уведомления о закрытии диалогового окна поиска с помощью setOnDismissListener()
, setOnCancelListener()
или обоих. Вам нужно зарегистрировать только OnDismissListener
, поскольку он вызывается каждый раз при закрытии диалогового окна поиска. OnCancelListener
относится только к событиям, когда пользователь явно закрывает диалоговое окно поиска, поэтому он не вызывается при выполнении поиска. После выполнения поиска диалоговое окно поиска автоматически закрывается.
Если текущая активность не является поисковой активностью, то при выполнении пользователем поиска запускаются обычные события жизненного цикла активности — текущая активность получает onPause()
, как описано в разделе «Введение в активности» . Однако если текущая активность является поисковой активностью, происходит одно из двух:
- По умолчанию поисковая активность получает намерение
ACTION_SEARCH
с вызовом методаonCreate()
, и новый экземпляр активности помещается на вершину стека активности. Теперь в стеке активности находятся два экземпляра поисковой активности, поэтому нажатие кнопки «Назад» возвращает вас к предыдущему экземпляру поисковой активности, а не к выходу из неё. - Если установить
android:launchMode
значение"singleTop"
, то поисковая активность получает намерениеACTION_SEARCH
с вызовомonNewIntent(Intent)
, передавая новое намерениеACTION_SEARCH
. Например, вот как можно обработать этот случай, когда режим запуска поисковой активности —"singleTop"
:Котлин
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) } } }
Ява
@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)
, активность не перезапускается, поэтому методgetIntent()
возвращает то же намерение, которое было получено с помощью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>
Передача данных контекста поиска
В некоторых случаях вы можете вносить необходимые уточнения в поисковый запрос внутри поисковой активности для каждого выполненного поиска. Однако, если вы хотите уточнить критерии поиска на основе активности, из которой пользователь выполняет поиск, вы можете предоставить дополнительные данные в намерении, которое система отправляет в вашу поисковую активность. Вы можете передать дополнительные данные в Bundle
APP_DATA
, который включен в намерение ACTION_SEARCH
.
Чтобы передать эти данные в вашу поисковую активность, переопределите метод onSearchRequested()
для активности, из которой пользователь может выполнить поиск, создайте Bundle
с дополнительными данными и вызовите startSearch()
для активации диалогового окна поиска. Например:
Котлин
override fun onSearchRequested(): Boolean { val appData = Bundle().apply { putBoolean(JARGON, true) } startSearch(null, false, appData, false) return true }
Ява
@Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; }
Возврат true означает, что вы успешно обработали это событие обратного вызова и вызвали startSearch()
для активации диалогового окна поиска. После того, как пользователь отправил запрос, он доставляется в вашу поисковую активность вместе с добавленными вами данными. Вы можете извлечь дополнительные данные из Bundle
APP_DATA
для уточнения поиска, как показано в следующем примере:
Котлин
val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false
Ява
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()
, как показано в следующем примере:
Котлин
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 }
Ява
@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. Система управляет списком подсказок и обрабатывает событие, когда пользователь выбирает подсказку.
Вы можете предоставить два вида поисковых предложений:
- Последние предложения по поиску запросов
- Эти предложения представляют собой слова, которые пользователь ранее использовал в качестве поисковых запросов в вашем приложении. Подробнее см. в разделе «Добавление пользовательских поисковых предложений» .
- Пользовательские предложения поиска
- Это поисковые подсказки, которые вы предоставляете на основе собственного источника данных, чтобы помочь пользователям мгновенно выбрать правильное написание или нужный им элемент. Подробнее см. в разделе «Добавление пользовательских поисковых подсказок» .