J'ai actuellement une SearchView
dans la barre d'action de mon application. Lorsque je clique sur l'icône de recherche, la variable SearchView
se développe et le clavier s'affiche comme prévu. Un clic sur le "X" dans la case SearchView
ferme la SearchView
comme prévu. Cependant, lorsque la SearchView
est activée et que j'appuie sur le bouton "Précédent", mon application est fermée. C’est le comportement correct, mais ce que j’essaie de faire maintenant, c’est de capturer le bouton précédent et de le laisser fermer la SearchView
(pas mon application) lorsque la SearchView
est visible. Existe-t-il un moyen d'appeler la SearchView
OnCloseListener()
par programmation lors d'une pression sur le bouton retour Par exemple, quelque chose comme ceci:
// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isSearchViewVisible) {
SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
.getActionView();
// This method does not exist
searchView.invokeClose();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
Basé sur la réponse de @MarcinOrlowski, vous pouvez aussi utiliser:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.setIconified(true);
} else {
super.onBackPressed();
}
}
Utilisation
searchView.setIconified(true)
J'ai aussi utilisé MenuItemCompat.collapseActionView
MenuItemCompat.collapseActionView(menuItem)
Il existe un moyen simple de le faire:
@Override
public void onBackPressed() {
if (!searchView.isIconified()) {
searchView.onActionViewCollapsed();
} else {
super.onBackPressed();
}
}
ou utiliser:
@Override
public void onBackPressed() {
searchView.onActionViewCollapsed();
super.onBackPressed();
}
Cela entraînera la réduction de searchView avant que vous appuyiez sur la touche back puis l'action back sera appelée.
Les deux solutions fonctionneront.
c'est la seule chose qui le fait pour moi:
toolbar.collapseActionView();
Pour intercepter le bouton RETOUR, remplacez onBackPressed()
( voir docs )
@Override
public void onBackPressed() {
if (isSearchViewVisible) {
SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
.getActionView();
// This method does not exist
searchView.invokeClose();
} else {
super.onBackPressed();
}
}
MODIFIER:
Si nécessaire, vous pouvez développer ou réduire la vue Action dans votre propre code en appelant expandActionView () et collapseActionView () sur le Élément du menu.
si vous avez saisi votre searchView
mSearchView.setIconified(true);
effacera seulement le texte.
La méthode correcte pour fermer searchView est
mSearchView.onActionViewCollapsed();
Utilisation:
searchView.setIconified(true);
Je préfère !searchView.isIconified()
à if(isSearchViewVisible)
dans la méthode onBackPressed()
car l'option 2 ne fonctionne pas lorsque des fragments sont ajoutés dans votre fragmentmanager's
backstack
que vous souhaitez afficher lorsque vous appuyez sur le bouton Précédent.
Pas besoin d'utiliser la méthode onBackPressed()
pour cela !! J'ai trouvé la solution, ne faites que ce que j'ai mentionné ci-dessous pour que SearchView gère lui-même l'appui sur le bouton de retour event.
Dans votre méthode onCreateOptionsMenu()
,
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem menuItem = menu.findItem(R.id.action_search);
SearchView searchview = (SearchView) menuItem.getActionView();
searchview.setIconifiedByDefault(true);
searchview.setQueryHint("Enter your keyword");
searchview.setOnQueryTextListener(this);
super.onCreateOptionsMenu(menu, inflater);
}
Dans votre attribut menu.xml add showAsAction et définissez ses valeurs sur "always|collapseActionView"
<item
Android:id="@+id/action_search_item"
Android:title="Search"
Android:icon="@drawable/ic_search_logo"
app:showAsAction="always|collapseActionView"
app:actionViewClass="Android.support.v7.widget.SearchView"/>
Et vous êtes prêt à partir;)
P.S. - Je cherchais une solution depuis longtemps et j'en ai trouvé une, j'espère que cela vous aidera tous.
Aussi, vous pouvez utiliser collapseActionView
. Il gère automatiquement le bouton de retour, en réduisant SearchView
<item
Android:id="@+id/action_search"
Android:icon="@drawable/ic_magnify"
Android:title="@string/action_title_search"
app:actionViewClass="Android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" />
Si vous n'utilisez aucune fonction dans la méthode onBackPressed()
, supprimez-la de votre Activity.So que la SearchView
gère elle-même l'événement onBackPress
.
J'utilise SearchView en tant que
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
searchview.setIconifiedByDefault(true);
searchview.setOnQueryTextListener(this);
searchview.setSubmitButtonEnabled(true);
searchview.setQueryHint("Search Here");
super.onCreateOptionsMenu(menu, inflater);
}
et mon menu.xml comme suit
<item
Android:id="@+id/action_search"
Android:icon="@drawable/search_tool"
Android:orderInCategory="1"
Android:title="Search"
app:actionViewClass="Android.support.v7.widget.SearchView"
app:showAsAction="always|collapseActionView"/>
Ma façon:
La classe publique CustomSearchView étend SearchView { public CustomSearchView (contexte de contexte final) { super (contexte); this.setIconifiedByDefault (true); } @Passer outre public boolean dispatchKeyEventPreIme (événement KeyEvent) { if (event.getKeyCode () == KeyEvent.KEYCODE_BACK && event.getAction () == KeyEvent.ACTION_UP) { this.onActionViewCollapsed (); } renvoyer super.dispatchKeyEventPreIme (event); } }
<item Android: id = "@ + id/menu_search" Android: title = "@ string/menu_search" Android: icon = "@ drawable/ic_search" Android: showAsAction = "collapseActionView | ifRoom" Android: actionViewClass = "com.myapp.CustomSearchView" />
CustomSearchView searchView = (CustomSearchView) menu.findItem (R.id.menu_search) .getActionView ();