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.
6 réponses
Utilisation:
searchMenuItem.collapseActionView();
au Lieu de:
searchView.onActionViewCollapsed();
Si vous utilisez AppCompat library
utilisation:
MenuItemCompat.collapseActionView(searchMenuItem);
Dans mon cas, l'appel de invalidateOptionsMenu();
ferme SearchView
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;
}
});
Solution mentionnée ici est simple et fonctionne parfaitement.
En Gros, Appelez setQuery("", false)
et setIconified(true)
SearchView
.
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.)
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;
}
};