Comment rejeter/fermer / effondrer 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'essaie de rechercher à 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. Chaque fois qu'il ferme mon clavier d'entrée, il ne fait rien. Comment peut-elle être exécutée correctement?

Modifier. Changement proposé 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 quand je clique sur la recherche.

j'ai aussi mis L'auditeur à L'intérieur de Treateoptionsmenu pour voir s'il change quoi que ce soit:

@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 closed boolean est false - je ne sais pas pourquoi. J'ai lu le doc mais ça ne me dit rien.

Edit3:

j'ai lu trop D'Internet là-dessus l'objet et il n'est pas clair pour moi encore. Widget de recherche est désactivée, le clavier est caché et l'action est effectuée. Le seul problème est la recherche n'est pas effondré de sorte qu'il couvre 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, parce que ma recherche n'est pas une vue mais un widget.

18
demandé sur Community 2014-05-29 11:40:28

6 réponses

Utilisation:

searchMenuItem.collapseActionView();

au Lieu de:

searchView.onActionViewCollapsed();

Si vous utilisez AppCompat library utilisation:

MenuItemCompat.collapseActionView(searchMenuItem);

42
répondu Newinjava 2016-12-27 16:27:55

Dans mon cas, l'appel de invalidateOptionsMenu(); ferme SearchView

9
répondu Rafael 2016-07-28 12:04:49

Dans menu_main.extension xml :

<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
répondu Khaled Jas 2016-02-19 20:08:15

Solution mentionnée ici est simple et fonctionne parfaitement.

En Gros, Appelez setQuery("", false) et setIconified(true)SearchView.

3
répondu Darshan Dorai 2017-05-23 11:54:39

on dirait que ce que vous cherchez est une façon de fermer la barre de recherche programmatiquement. Malheureusement, il n'y a pas de méthode ou de solution équivalente pour cela. Vous avez déjà vu un autre post qui avait quelques suggestions, mais pas de façon réelle de le faire.

votre première édition au-dessus de cela appelle setIconified(true) est la meilleure alternative. Les docs suggèrent d'appeler setIconified(true) doit faire s'effondrer le widget de recherche, l'effacer, et le supprimer de focus si l'attribut iconifiedByDefault est true (ce qui est par défaut donc je ne vois aucun problème avec votre activity_main_actions.XML.)

1
répondu strwils 2017-05-23 12:34:22

Salut j'ai fait face à un scénario similaire et donc je pense que ce changement de code devrait faire l'affaire.

Espérons que cette aide...:)

@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;
}
};
0
répondu Max 2015-01-01 13:50:12