На панели действий отображается только один элемент рядом с поисковым представлением.

Я хочу иметь вид поиска и две кнопки в панели действий. Поэтому я создал menu / options_menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_search" android:title="Search" android:icon="@drawable/ic_menu_search" android:showAsAction="always" android:actionViewClass="android.widget.SearchView" /> <item android:title="Route" android:id="@+id/action_route" android:icon="@drawable/route" android:showAsAction="always" /> <item android:title="Cancel" android:id="@+id/action_cancel" android:icon="@drawable/cancel" android:showAsAction="always" /> </menu> 

Я раздуваю его в коде:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); return true; } 

Это то, что я получаю:

Введите описание изображения здесь

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

  //searchView.setIconifiedByDefault(false); 

Введите описание изображения здесь

Тем не менее, я хочу, чтобы виджет поиска расширялся, и оба элемента были видны. Является ли это возможным?

Обновить

Мне удалось сделать их видимыми, установив android:orderInCategory="1" для «Маршрут» и «Отмена» и android:orderInCategory="2" для виджета поиска:

Введите описание изображения здесь

Это почти то, что я хотел. Проблема в том, что я хочу, чтобы виджет поиска сначала (самый левый), а затем эти два элемента. Является ли это возможным?

Обновление 2

Я попробовал «рекомендуемый» способ. Я установил для SearchView :

 android:showAsAction="always|collapseActionView" 

После того, как я нажму на значок поиска, я получаю расширенный вид:

Введите описание изображения здесь

Две проблемы:

  1. (Малый) Интерфейс навигации занимает комнату слева, что уменьшает пространство, доступное для SearchView .
  2. (Major) Значок Android отображается как часть пользовательского интерфейса навигации. Могу ли я избавиться от него?

Создайте одно демо, проверьте его:

Menu.xml:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:title="Search" android:icon="@android:drawable/ic_search_category_default" app:actionLayout="@layout/searchview" app:showAsAction="always|collapseActionView"/> <item android:title="Route" android:id="@+id/action_route" android:icon="@mipmap/ic_launcher" app:showAsAction="always" /> <item android:title="Cancel" android:id="@+id/action_cancel" android:icon="@mipmap/ic_launcher" app:showAsAction="always" /> </menu> 

Searchview.xml:

 <?xml version="1.0" encoding="utf-8"?> <SearchView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

Ява :

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); if(searchItem!=null) { searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); } return true; } 

Отредактированная Java на основе требования (всегда открывать searchview):

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); MenuItem searchItem = menu.findItem(R.id.action_search); searchItem.expandActionView(); final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); if(searchItem!=null) { searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // This listener use for handle back press if you want to go back without collapsing searchview MenuItemCompat.setOnActionExpandListener(searchItem,new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { onBackPressed(); return false; } }); } return true; } 

Скриншоты:

Без клика С кликом

Измените onCreateOptionsMenu следующим образом, чтобы явно настроить элементы меню, которые видны, когда SearchView меню SearchView имеет фокус.

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); if (menu.getItem(0).isFocused()) //detect if search view has focus { //explicitly set menu items visible menu.getItem(1).setVisible(true); menu.getItem(2).setVisible(true); } return true; } 

Вы можете настроить ширину расширенного поиска

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.MATCH_PARENT); params.width=500; searchView.setLayoutParams(params); menu.findItem(R.id.action_search).expandActionView(); return true; } 

попробуй это:

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_search" android:title="Search" android:icon="@drawable/ic_menu_search" android:orderInCategory="1" android:showAsAction="collapseActionView|ifRoom" android:actionViewClass="android.widget.SearchView" /> <item android:title="Route" android:id="@+id/action_route" android:icon="@drawable/route" android:orderInCategory="2" android:showAsAction="always" /> <item android:title="Cancel" android:id="@+id/action_cancel" android:icon="@drawable/cancel" android:orderInCategory="2" android:showAsAction="always" /> </menu> 

Я сделал это, установив максимальную ширину для просмотра, равную ширине экрана, минус ширина элемента действия.

Рез / меню / search.xml

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:icon="@drawable/ic_search_white_24dp" android:title="@string/title_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always" /> <item android:id="@+id/action_filter" android:icon="@drawable/ic_filter_list_white_24dp" android:title="@string/title_filter" app:showAsAction="always" /> </menu> 

Активность или фрагмент:

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.search, menu); mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); mSearchView.setIconified(false); mSearchView.setMaxWidth(getSearchViewMaxWidth()); mSearchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { performSearch(""); return true; // Disable dismissing the search view } }); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { performSearch(query); return true; } @Override public boolean onQueryTextChange(String newText) { return false; } }); } @Px private int getSearchViewMaxWidth() { final int screenWidth = getResources().getDisplayMetrics().widthPixels; final int actionItemWidth = getResources().getDimensionPixelSize(R.dimen.action_item_width); return screenWidth - actionItemWidth; } 

RES / значения / dimens.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- ... --> <dimen name="action_item_width">48dp</dimen> </resources>