Когда вы будете готовы добавить функцию поиска в свое приложение, Android поможет вам реализовать пользовательский интерфейс либо с помощью диалогового окна поиска, которое появляется в верхней части окна активности, либо с помощью виджета поиска, который можно вставить в макет. И диалоговое окно поиска, и виджет могут передавать поисковый запрос пользователя в определенную активность вашего приложения. Таким образом, пользователь может инициировать поиск из любой активности, где доступно диалоговое окно поиска или виджет, и система запустит соответствующую активность для выполнения поиска и отображения результатов.
К другим функциям, доступным для диалогового окна поиска и виджета, относятся:
- Голосовой поиск
- Поисковые подсказки на основе последних запросов
- Поисковые подсказки, соответствующие реальным результатам в данных вашего приложения.
В этом документе показано, как настроить ваше приложение для предоставления интерфейса поиска, который использует систему Android для обработки поисковых запросов с помощью диалогового окна поиска или виджета поиска.
Дополнительные материалы:
Основы
Прежде чем начать, решите, хотите ли вы реализовать интерфейс поиска с помощью диалогового окна поиска или виджета поиска. Они предоставляют одинаковые функции поиска, но немного по-разному:
- Диалоговое окно поиска — это компонент пользовательского интерфейса, управляемый системой Android. При активации пользователем диалоговое окно поиска появляется в верхней части окна.
Система Android управляет всеми событиями в диалоговом окне поиска. Когда пользователь отправляет запрос, система передает его указанному вами действию для обработки поиска. Диалоговое окно также может предлагать варианты поиска во время ввода текста пользователем.
- Виджет поиска — это экземпляр
SearchView, который можно разместить в любом месте макета. По умолчанию виджет поиска ведет себя как стандартный виджетEditTextи ничего не делает, но вы можете настроить его так, чтобы система Android обрабатывала все события ввода, передавала запросы соответствующему Activity и предоставляла подсказки поиска — как и диалоговое окно поиска.
Когда пользователь выполняет поиск из диалогового окна поиска или виджета поиска, система создает Intent и сохраняет в нем пользовательский запрос. Затем система запускает активность, которую вы объявили для обработки поиска — «активность, доступная для поиска» — и передает ей 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 с возможностью поиска — это Activity в вашем приложении, которая выполняет поиск на основе поисковой строки и отображает результаты поиска.
Когда пользователь выполняет поиск в диалоговом окне поиска или виджете, система запускает ваше действие поиска и передает ему поисковый запрос в Intent с действием ACTION_SEARCH . Ваше действие поиска получает запрос из дополнительного параметра QUERY Intent, затем выполняет поиск в ваших данных и отображает результаты.
Поскольку диалоговое окно поиска или виджет можно включить в любую другую активность вашего приложения, система должна знать, какая именно активность является активностью, доступной для поиска, чтобы правильно обработать поисковый запрос. Поэтому сначала объявите свою активность, доступную для поиска, в файле манифеста 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) } } }
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для получения информации о сетевых 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() .
Вы также можете включить функцию «поиск по вводу текста», которая активирует диалоговое окно поиска, когда пользователь начинает печатать на клавиатуре. Нажатия клавиш вставляются в диалоговое окно поиска. Вы можете включить поиск по вводу текста в вашем Activity, вызвав метод setDefaultKeyMode или DEFAULT_KEYS_SEARCH_LOCAL в методе ` onCreate() вашего Activity.
Влияние диалога поиска на жизненный цикл вашей активности
Диалоговое окно поиска — это всплывающее Dialog , расположенное в верхней части экрана. Оно не вызывает никаких изменений в стеке активности, поэтому при появлении диалогового окна поиска никакие методы жизненного цикла, такие как onPause() не вызываются. Ваша активность теряет фокус ввода, поскольку фокус ввода передается диалоговому окну поиска.
Если вы хотите получать уведомления об активации диалогового окна поиска, переопределите метод onSearchRequested() . Когда система вызывает этот метод, это означает, что ваше действие теряет фокус ввода в пользу диалогового окна поиска, поэтому вы можете выполнять любую работу, соответствующую этому событию, например, приостановить игру. Если вы не передаете данные контекста поиска — это обсуждается в другом разделе этого документа — завершите метод, вызвав реализацию суперкласса:
Котлин
override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() }
Java
@Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
Если пользователь отменяет поиск, нажав кнопку «Назад», диалоговое окно поиска закрывается, и фокус ввода возвращается к активности. Вы можете зарегистрироваться для получения уведомлений о закрытии диалогового окна поиска с помощью 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) } } }
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), активность не перезапускается, поэтому метод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>
Передайте данные контекста поиска
В некоторых случаях вы можете вносить необходимые уточнения в поисковый запрос внутри поискового действия для каждого выполненного поиска. Однако, если вы хотите уточнить критерии поиска на основе действия, из которого пользователь выполняет поиск, вы можете предоставить дополнительные данные в намерении, которое система отправляет вашему поисковому действию. Вы можете передать дополнительные данные в пакете APP_DATA Bundle , который включен в намерение ACTION_SEARCH .
Чтобы передать данные такого типа в ваше действие с возможностью поиска, переопределите метод onSearchRequested() для действия, из которого пользователь может выполнять поиск, создайте Bundle с дополнительными данными и вызовите метод startSearch() для активации диалогового окна поиска. Например:
Котлин
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() для активации диалога поиска. После того, как пользователь отправит запрос, он будет доставлен в вашу активность поиска вместе с добавленными вами данными. Вы можете извлечь дополнительные данные из Bundle APP_DATA для уточнения поиска, как показано в следующем примере:
Котлин
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() , как показано в следующем примере:
Котлин
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 предоставляет несколько дополнительных функций, которые могут вам понадобиться:
- Кнопка отправки
- По умолчанию кнопка для отправки поискового запроса отсутствует, поэтому пользователю приходится нажимать клавишу Enter на клавиатуре, чтобы начать поиск. Вы можете добавить кнопку «Отправить», вызвав
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. Система управляет списком подсказок и обрабатывает событие, когда пользователь выбирает подсказку.
Вы можете предложить два типа поисковых подсказок:
- Последние подсказки по поисковым запросам
- Эти подсказки представляют собой слова, которые пользователь ранее использовал в качестве поисковых запросов в вашем приложении. Дополнительную информацию см. в разделе «Добавление пользовательских поисковых подсказок» .
- Пользовательские подсказки для поиска
- Это поисковые подсказки, которые вы предоставляете из собственного источника данных, чтобы помочь пользователям сразу выбрать правильное написание или нужный им элемент. Дополнительную информацию см. в разделе «Добавление пользовательских поисковых подсказок» .
