Добавить поле поиска в ActionBar

By | 05.03.2014

Для того, чтобы добавить в ActionBar виджет поиска, который будет отображаться в виде иконки и открываться при клике, необходимо выполнить несколько шагов.

1. Создать папку ./res/xml и добавить в неё XML-файл с названием searchable.xml следующего содержимого:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
  android:hint="@string/search_hint"
  android:label="@string/app_name" />

2. Немного поправить Android manifest, добавив следующие строки в нужное Activity:

<activity
  <!-- указываем, что данное activity принимать интент, но не запускаться заново -->
  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>

3. Добавить виджет поиска в ActionBar вместе с иконкой. Это делается в файле меню данной Activity

<item
  android:id="@+id/search"
  android:actionViewClass="android.widget.SearchView"
  android:icon="@drawable/ico_search"
  android:showAsAction="collapseActionView|ifRoom"
  android:title="@string/menu_search"/>

4. В методе onCreateOptionsMenu добавить код:

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

5. Словить интент, когда нажали Искать

@Override
public void onNewIntent(Intent intent) {
  // Проверяем, что новый интент передан именно для поиска
  if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
    // Здесь будет храниться то, что пользователь ввёл в поисковой строке
    String search = intent.getStringExtra(SearchManager.QUERY);
  }
}