Сохранение обратной совместимости

SearchView и панель действий доступны только на Android 3.0 и более поздних версиях. Для поддержки старых платформ вы можете вернуться к диалоговому окну поиска. Диалоговое окно поиска — это предоставляемый системой пользовательский интерфейс, который при вызове накладывается поверх вашего приложения.

Установите минимальный и целевой уровни API

Чтобы настроить диалоговое окно поиска, сначала объявите в своем манифесте, что вы хотите поддерживать старые устройства, но хотите использовать Android 3.0 или более поздние версии. Когда вы это сделаете, ваше приложение автоматически использует панель действий на Android 3.0 или более поздней версии и использует традиционную систему меню на старых устройствах:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

<application>
...

Предоставьте диалог поиска для старых устройств

Чтобы вызвать диалоговое окно поиска на старых устройствах, вызывайте onSearchRequested() каждый раз, когда пользователь выбирает пункт меню поиска в меню параметров. Поскольку устройства Android 3.0 и более поздних версий отображают SearchView на панели действий (как показано в первом уроке), только версии старше 3.0 вызывают onOptionsItemSelected() , когда пользователь выбирает пункт меню поиска.

Котлин

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.search -> {
            onSearchRequested()
            true
        }
        else -> false
    }
}

Ява

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

Проверьте версию сборки Android во время выполнения

Во время выполнения проверьте версию устройства, чтобы убедиться, что на старых устройствах не происходит неподдерживаемого использования SearchView . В нашем примере кода это происходит в методе onCreateOptionsMenu() :

Котлин

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    menuInflater.inflate(R.menu.options_menu, menu)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
        (menu.findItem(R.id.search).actionView as SearchView).apply {
            setSearchableInfo(searchManager.getSearchableInfo(componentName))
            setIconifiedByDefault(false)
        }
    }
    return true
}

Ява

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }
    return true;
}