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