Searchview не закрывается правильно на FIRST back press (это только потеря фокуса)

Я должен дважды нажать на него, чтобы закрыть SearchView . Зачем? При первом нажатии SearchView теряет фокус …

Установка setOnKeyListener в SearchView тоже не работает …

Кстати, я использую реализацию ABS …

Мой код прост и выглядит следующим образом:

 mMenuItemSearch = menu.findItem(R.id.search); mSearchView = new SearchView(getSupportActionBar().getThemedContext()); mMenuItemSearch.setActionView(mSearchView); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { mPagerManager.getFragment(mSelectedPos).adapter.getFilter().filter(newText); return true; } public boolean onQueryTextSubmit(String query) { return true; } }); 

Solutions Collecting From Web of "Searchview не закрывается правильно на FIRST back press (это только потеря фокуса)"

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

Я решил это так:

 ... public class MyFragment extends Fragment implemented SearchView.OnFocusChangeListener <---- ... @Override public void onFocusChange(View v, boolean hasFocus) { MenuItem menuItem = menu.findItem(R.id.action_search); SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem); if(!hasFocus) { sv.onActionViewCollapsed(); <---- interactionListener.showDrawerToggle(true); <---- } } ... public void configureSearchView(Menu menu) { this.menu = menu; MenuItem menuItem = menu.findItem(R.id.action_search); SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem); sv.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { interactionListener.showDrawerToggle(false); } }); sv.setOnQueryTextListener(this); sv.setOnCloseListener(this); sv.setSubmitButtonEnabled(false); sv.setIconifiedByDefault(true); sv.setOnQueryTextFocusChangeListener(this); <---- if(initialQuery != null) { sv.setIconified(false); menuItem.expandActionView(); sv.setQuery(initialQuery, true); } } ... 

Попробуйте это в вашем методе configureSearchView (), он работает для меня.

  mSearchView.post(new Runnable() { @Override public void run() { mSearchView.setIconified(false); } }); 

Пробовав много, я нашел решение.

В onQueryTextSubmit(String query) write searchView.clearFocus();

Затем в onBackPressed() используйте ниже код:

  if (!searchView.isIconified()) { searchView.setIconified(true); searchView.onActionViewCollapsed(); } else { super.onBackPressed(); } 

Единственный способ исправить это – использовать android.support.v7.widget.SearchView вместо android.widget.SearchView

Я исправил это, сделав это.

Вам нужно будет расширить SearchView и переопределить dispatchKeyEventPreIme

 public class SearchView extends android.support.v7.widget.SearchView { public SearchView(Context context) { super(context); } public SearchView(Context context, AttributeSet attrs) { super(context, attrs); } public SearchView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { onActionViewCollapsed(); } } return super.dispatchKeyEventPreIme(event); } } 

OnBackPressed должен только очистить фокус от поиска (SearchAutoComplete) EditText, это нормальное поведение.

Но если вы хотите изменить это поведение, сделайте это (:

  final SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); final MenuItem searchViewItem = menu.findItem(R.id.searchView); searchAutoComplete.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!searchAutoComplete.isFocused()){ searchViewItem.collapseActionView(); searchView.onActionViewCollapsed(); viewManager.dismissSearchDropDownPopupWindow(); } } }); 

Вы можете вызвать view.requestFocus() чтобы дать фокус другому виду. Таким образом, поиск будет закрыт одним нажатием.