J'utilise une seule activité pour afficher SearchView ainsi que pour afficher les résultats de recherche. Les résultats de la recherche ne sont qu'un sous-ensemble d'éléments. La recherche agit donc comme un filtre. Tout semble bien fonctionner, sauf que je ne sais pas comment restaurer tous les éléments de la vue lorsque l'utilisateur clique sur le bouton Précédent de SearchView.
Ou peut-être existe-t-il un autre moyen de détecter le passage d'un utilisateur des résultats de la recherche à la vue précédente (qui, dans mon cas, est la même vue).
Merci
En examinant le titre de votre question, vous ne savez pas comment détecter le moment où la SearchView
est fermée et vous ne pouvez donc pas restaurer vos vues dans l'état "normal" lorsque la SearchView
n'est plus ouverte.
Solution obsolète à partir d'Android 4.0+
La solution (simple) consiste à ajouter un: SearchView.OnCloseListener
à votre SearchView
, comme ceci:
SearchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
// This is where you can be notified when the `SearchView` is closed
// and change your views you see fit.
}
});
MODIFIER:
Solution mise à jour fonctionnant sous Android 4.0+
Apparemment, la OnCloseListener
est boguée et ne fonctionne pas sur les versions plus récentes d'Android (4.0+). Voir: https://code.google.com/p/Android/issues/detail?id=25758
La solution consiste à utiliser la version de la bibliothèque SearchView
:
Ma onCreateOptionsMenu
ressemble à ceci:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
MenuItem searchMenuItem = menu.findItem(R.id.searchView);
SearchView searchView = (SearchView) searchMenuItem.getActionView();
MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(ScrollingActivity.this, "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(ScrollingActivity.this, "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show();
return true;
}
});
}
Quant à la raison pour laquelle Google n'a même pas pris la peine d'écrire un commentaire dans la documentation, je ne le sais pas, mais c'est triste.
EDIT2:
Il suffit d'ajouter le lien ajouté par @MateiRadu dans les commentaires:
comment gérer le bouton précédent de la vue Recherche dans Android
Cela montre également comment utiliser OnActionExpandListener
au lieu de OnCloseListener
.
J'espère que cela t'aides.
La réponse de Darwind fera l'affaire, mais cela ne fonctionne que lorsque l'utilisateur appuie sur le bouton précédent pour fermer le clavier et lorsque SearchView
n'est plus activé.
La meilleure façon de le faire est d'écouter les modifications du texte de SearchView
.
De cette façon, vous pouvez restaurer des vues et contrôler l’UI pendant la mise à jour du texte.
voici comment je le fais.
SearchView searchView = new SearchView(context);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// this is when user is done typing and clicks search
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// you can use this to do a "live" search while the user is typing.
// this will trigger each time user changes (adds or removes) text
// so when newText is empty, restore your views
return false;
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean newViewFocus)
{
if (!newViewFocus)
{
//Collapse the action item.
searchItem.collapseActionView();
//Clear the filter/search query.
myFilterFunction("");
}
}
});
return super.onCreateOptionsMenu(menu);
}
Il y a une autre astuce:
searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() {
@Override
public void onSearchViewShown() {
if(!txtToolbarTitle.getText().toString().isEmpty()){
searchView.setQuery(txtToolbarTitle.getText().toString()+ " ", false);
}
}
@Override
public void onSearchViewClosed() {
if(txtToolbarTitle.getText().toString().isEmpty()){
finish();
}
}
});