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

Ответ 1

После многих попыток я нашел решение.

В onQueryTextSubmit(String query) напишите searchView.clearFocus();

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

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

Ответ 2

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

Ответ 3

попробуй это. Это сработало для меня после многих попыток.

mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
  @Override
  public void onFocusChange(View v, boolean hasFocus) {
    if (!hasFocus) {
      MenuItemCompat.collapseActionView(searchMenu);
    }
  }
});

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Вам нужно расширить 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);
    }
}

Ответ 9

Нужно вызвать метод clearFocus() для SearchView после нажатия кнопки поиска.
Например:

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        mSearchView.clearFocus();
        //...
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }
});

Ответ 10

Если ваш SearchView находится на фрагменте, подобном моему, используйте следующий фрагмент в Kotlin

searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
      if(!hasFocus){

         // iconify the SearchView when the focus is lost
         searchView.isIconified = true
      }
 }

Благодаря @vikoo answer.

Ответ 11

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