web-dev-qa-db-fra.com

Comment détecter une pression sur le bouton Précédent de SearchView?

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

11
bdristan

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.

30
Darwind

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);
}
1
Rohit Bansal

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