Auto Collapse ActionBar SearchView на мягкой клавиатуре закрыть

В настоящее время я использую пункт меню ActionBar для отображения SearchView в панели действий. Когда элемент меню поиска расширяется, отображается мягкая клавиатура, которую я хочу. Теперь, когда пользователь нажимает кнопку «Назад», чтобы закрыть мягкую клавиатуру, я также хотел бы свернуть SearchView в панели действий.

Я попытался реализовать следующие прослушиватели OnKeyListener и OnFocusChangeListener в MenuItem и ActionView. Я также попытался использовать OnBackPressed () в Activity. Ни одно из указанных выше не обнаружит, когда кнопка «Назад» используется для закрытия мягкой клавиатуры.

Есть идеи?

Я внедрил OnActionExpandListener, чтобы узнать, когда видна SearchView.

Solutions Collecting From Web of "Auto Collapse ActionBar SearchView на мягкой клавиатуре закрыть"

Я объясню ответ @ user1258568 за ленивый. Это сработало для меня. Обратите внимание, что он очищает ваш запрос, когда фокус потерян.

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean queryTextFocused) { if(!queryTextFocused) { searchMenuItem.collapseActionView(); searchView.setQuery("", false); } } }); 

Я нашел лучшее решение.

 searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListener когда клавиатура отображается или скрыта. Сначала вызывается, когда отображается клавиатура, и поиск будет иметь фокус. Возвращается снова, когда keyboard скрыта, а поиск в режиме просмотра потеряет фокус, можно close search view затем использовать

 menuItem.collapseActionView(). 

Просто переопределить onBackPressed следующим образом:

 @Override public void onBackPressed() { if (searchView.isShown()){ searchView.onActionViewCollapsed(); //collapse your ActionView searchView.setQuery("",false); //clears your query without submit isClosed = true; //needed to handle closed by back } else{ super.onBackPressed(); } } 

И ваш onCreateOptionsMenu будет раздувать mSearchView следующим образом:

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu_search, menu); mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); mSearchView.setOnQueryTextListener(this); mSearchView.setOnSearchClickListener(this); mSearchView.setOnCloseListener(this); isClosed = true; return true; } 

У вас класс реализует следующее:

 public class myActivity extends FragmentActivity implements SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener { 

Которые вам также понадобятся:

 @Override public void onClick(View view) { isClosed = false; } @Override public boolean onClose() { isClosed = true; return false; } 

Вам нужно будет сделать «mSearchView» и «isClosed» глобальными переменными для активности.

Ответ от Джона Уиллиса отлично работает. Это улучшение его ответа.

Сначала создайте новый класс, который реализует View.OnFocusChangeListener :

 public class SearchViewFocusListener implements View.OnFocusChangeListener { private final MenuItem mMenuItem; public SearchViewFocusListener(MenuItem menuItem) { mMenuItem = menuItem; } @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { mMenuItem.collapseActionView(); if (v instanceof SearchView) { ((SearchView) v).setQuery("", false); } } } } 

Затем установите прослушиватель в SearchView :

 searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem)); 

Это то, что я сделал для того, чтобы клавиатура исчезла. Вы можете попытаться выяснить, работает ли это для вас. Я установил searchView в невидимое, а затем снова на видимое.

  //set query change listener searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure keyboard disappears when query is submitted */ searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); return false; } }); 

Это можно сделать так:

  private void setupSearchView(Menu menu) { final MenuItem searchMenuItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) searchMenuItem.getActionView(); [...] searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { searchMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(String newText) { return true; } }); } 

Решения, основанные на setOnQueryTextFocusChangeListener (), не работали для меня, потому что событие не было запущено – searchView не терял фокус при отправке, вероятно, потому, что я выполнял поиск в той же самой деятельности, которая содержит Search Search.

В любом случае, я думаю, что использование OnQueryTextListener более корректно, поскольку оно описывает событие более точного представления текста.

Вам нужно только поместить атрибут «collapseActionView» в макет меню

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_item_search" android:title="@string/search" android:iconifiedByDefault="true" android:icon="@drawable/ic_action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom|collapseActionView"/> <--this one </menu> 

Это даст вам функциональность, которую вы ищете сами по себе. Не забудьте вызвать метод clearFocus в SearchView, чтобы закрыть клавиатуру после отправки запроса.

 @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.home_screen, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); final SearchView searchView = (SearchView) searchMenuItem .getActionView(); searchView.setIconifiedByDefault(false); if (searchManager != null && searchView != null) { searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); searchView .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (searchMenuItem != null) { searchMenuItem.collapseActionView(); }// end if if (searchView != null) { searchView.setQuery("", false); }// end if }// end if } }); searchView .setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { /** * hides and then unhides search tab to make sure * keyboard disappears when query is submitted */ if (searchView != null) { searchView.setVisibility(View.INVISIBLE); searchView.setVisibility(View.VISIBLE); } return false; } @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } }); } return super.onCreateOptionsMenu(menu); } 

Если вы хотите свернуть клавиатуру, когда пользователь нажимает значок поиска на клавиатуре, это может быть достигнуто простым

inside onquerytextsubmitted {

searchView.clearfocus()

}

Вам нужно вызвать setIconified дважды.

Чтобы фактически свернуть ваш поиск и закрыть клавиатуру.
С первым текстом запроса поиска открывается с помощью второй клавиатуры вызова и поиск открывается.

По какой-то причине menuItem.collapseActionView() не работал, поэтому вместо этого я использовал searchView.setIconified(true) .

Это дает результат ниже как образец кода.

 final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); final SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { searchView.setIconified(true); } } });