Searchview ne se ferme pas correctement sur FIRST back press (c'est seulement perdre la mise au point)

Je dois appuyer deux fois sur le bouton arrière, pour fermer le SearchView . Pourquoi? Sur la première pression, le SearchView ne perd que la mise au point …

setOnKeyListener sur SearchView ne fonctionne pas non plus …

  • Comment cloner Joda DateTime?
  • Android: Utilisez une instruction SWITCH avec setOnClickListener / onClick pour plus d'un bouton?
  • Android XML: RuntimeException: Impossible de résoudre l'attribut à l'index 6
  • Comment utiliser l'effet Flipboard sur Android
  • Encodeur et décodeur Base64
  • La fonction de dictée hors ligne est-elle dans la partie Jelly Bean d'AOSP et, dans l'affirmative, dans quel package est-ce?
  • Btw, j'utilise l'application ABS …

    Mon code est simple et ressemble à ce qui suit:

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

    8 Solutions collect form web for “Searchview ne se ferme pas correctement sur FIRST back press (c'est seulement perdre la mise au point)”

    La vue de recherche se refermant est le comportement attendu et ce à quoi nous nous sommes habitués. Vous pouvez annuler cela si vous le souhaitez en étendant votre propre SearchView et / ou en écoutant un OnBackPressed () pour appeler terminer votre activité sur laquelle le SearchView habite.

    Je l'ai résolu ainsi:

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

    Essayez ceci dans votre méthode configureSearchView (), cela fonctionne pour moi.

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

    Après avoir essayé beaucoup, j'ai trouvé la solution.

    Dans onQueryTextSubmit(String query) écrivez searchView.clearFocus();

    Ensuite, onBackPressed() utilise le code ci-dessous:

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

    La seule façon de résoudre ce problème consiste à utiliser android.support.v7.widget.SearchView au lieu d' android.widget.SearchView

    Je l'ai réglé en faisant cela.

    Vous devriez étendre SearchView et annuler 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 ne doit que limiter la mise au point de la vue de recherche (SearchAutoComplete) EditText, c'est un comportement normal.

    Mais si vous souhaitez modifier ce comportement, faites-le (:

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

    Vous pouvez appeler view.requestFocus() pour mettre l'accent sur une autre vue. De cette façon, la vue de recherche se fermera avec une pression arrière.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.