Intereting Posts
Обои не подходят для экрана устройства Set Прозрачный фон для alertdialog в android Как я могу динамически выбирать, какую активность запускать при открытии приложения? Понимание матрицы проекции libGDX Как получить текущее местоположение в Google Maps Android API v2? Android: Как предотвратить передачу каких-либо событий касания от представления к тому, что находится под ним? Переключение на определенный фрагмент дает странное java.lang.NullPointerException Не удается импортировать классы android.hardware.camera2 импорта. Сортировка Android strings.xml в алфавитном порядке Использование MultiDexApplication приводит к тому, что тест Robolectric для класса приложения прерывается Краткий способ написания новых классов DialogPreference? Как сделать функцию ядра linux доступной для ftrace function_graph tracer? Использование surfaceView для захвата видео Как изменить текст TextView, нажав кнопку Изображение uri не отображает изображения на ImageView на некоторых устройствах Android

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() чтобы дать фокус другому виду. Таким образом, поиск будет закрыт одним нажатием.