web-dev-qa-db-fra.com

Comment ignorer / fermer / réduire SearchView dans ActionBar dans MainActivity?

J'essaie d'effacer et de fermer SearchView après avoir entré une valeur. J'ai trouvé une solution mais elle ferme la recherche et n'effectuera aucune action si j'essaye de chercher à nouveau.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);

    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(searchListener);

    return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
    @Override
    public boolean onQueryTextChange(String arg0) {
        return false;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
        try {
            searchView.onActionViewCollapsed();
        }
        catch(Exception ex){
            ex.printStackTrace();
            System.out.println(ex);
        }
        return true;
    }
};

Je ne peux chercher que pour la première fois. La prochaine fois, il ne ferme que mon clavier d'entrée et ne fait rien. Comment peut-il être exécuté correctement?

Éditer. Le changement suggéré ressemble à ceci:

        try {
            searchView.setIconified(true);
        }

activity_main_actions.xml:

   <!-- Search Widget -->
   <item Android:id="@+id/action_search"
       Android:icon="@drawable/ic_action_search"
       Android:title="@string/action_search"
       Android:showAsAction="always"
       Android:actionViewClass="Android.widget.SearchView"/>

Edit2:

J'ai changé showAsAction="always|collapseActionView" mais il ferme mon application lorsque je clique sur la recherche.

J'ai également mis l'écouteur dans OnCreateOptionsMenu pour voir si cela change quelque chose:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);
    searchMenuItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener(){

            @Override
            public boolean onQueryTextChange(String arg0) {
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                if (searchMenuItem != null) {
                    boolean closed = searchMenuItem.collapseActionView();
                    Toast.makeText(getApplicationContext(), "closing: " + closed, Toast.LENGTH_SHORT).show();
                }
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }
    });    
    return super.onCreateOptionsMenu(menu);
}

Et le closed booléen est false - je ne sais pas pourquoi. J'ai lu le doc mais ça ne me dit rien.

Edit3:

J'ai trop lu Internet sur ce sujet et ce n'est pas encore clair pour moi. Le widget de recherche est effacé, le clavier est masqué et l'action est exécutée. Le seul problème est que la recherche n'est pas réduite, elle couvre donc le reste des boutons d'action sur l'ActionBar.

            @Override
            public boolean onQueryTextSubmit(String query) {
                searchView.setIconified(true);
                searchView.clearFocus();
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }

Ici J'ai lu que collapseActionView () ne fonctionnera pas, car ma recherche n'est pas une vue mais un widget.

21
Kamil

Utilisation:

searchMenuItem.collapseActionView();

Au lieu de:

searchView.onActionViewCollapsed();

Si vous utilisez AppCompat library, Utilisez:

MenuItemCompat.collapseActionView(searchMenuItem);

45
Newinjava

Dans mon cas, appeler invalidateOptionsMenu(); ferme SearchView

12
Rafael

La solution mentionnée ici est simple et fonctionne parfaitement.

Fondamentalement, appelez setQuery("", false) et setIconified(true) sur SearchView.

3
Darshan Dorai

Dans menu_main.xml, ajoutez:

<item Android:id="@+id/action_search"
    Android:icon="@Android:drawable/ic_menu_search"
    Android:title="Search"
    app:showAsAction="collapseActionView|ifRoom"
    Android:orderInCategory="1"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    Android:menuCategory="secondary"
    />

et dans onCreateOptionsMenu

final  MenuItem miSearch = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) miSearch.getActionView();
    searchView.setQueryHint("Searh For");
    searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Toast.makeText(context,query, Toast.LENGTH_LONG).show();
            // Here Put Your Code.
            //searchView.onActionViewCollapsed();
            miSearch.collapseActionView();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
3
Khaled Jas

Il semble que ce que vous recherchez soit un moyen de fermer la barre de recherche par programme. Malheureusement, il n'existe pas de méthode ou de solution de contournement équivalente pour cela. Vous avez peut-être déjà vu n autre post qui avait quelques suggestions, mais aucun moyen réel de le faire.

Votre première modification ci-dessus qui appelle setIconified(true) est la meilleure alternative. Les documents suggèrent d'appeler setIconified(true) devrait réduire le widget de recherche, l'effacer et le supprimer du focus si l'attribut iconifiedByDefault est vrai (ce qui est par défaut, donc je ne vois aucun problème avec votre activity_main_actions.xml).

1
strwils

Salut, j'ai fait face à un scénario similaire et je pense que cela a changé en code devrait faire l'affaire.
J'espère que cela t'aides...:)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
Menu mMenuItem = menu.findItem(R.id.action_search_loc);  // take a reference with menue item
searchView = (SearchView) mMenuItem.getActionView(); //use that to find searchview
searchView.setOnQueryTextListener(searchListener);

return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
    return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
    new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query +    "&lang=pl").execute();
    try {
        mMenuItem.collapseActionView(); //this will collapse your search view
    }
    catch(Exception ex){
        ex.printStackTrace();
        System.out.println(ex);
    }
    return true;
}
};
1
Max