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; }