Ich verwende eine einzelne Aktivität, um SearchView sowie Suchergebnisse anzuzeigen. Die Suchergebnisse sind nur eine Teilmenge von Elementen, daher dient die Suche als Filter. Alles scheint gut zu funktionieren, außer dass ich nicht herausfinden kann, wie alle Elemente in der Ansicht wiederhergestellt werden, wenn auf eine Schaltfläche "Zurück" in SearchView geklickt wird.
Oder vielleicht gibt es eine andere Möglichkeit, zu erkennen, wann ein Benutzer von den Suchergebnissen zur vorherigen Ansicht navigiert (die in meinem Fall dieselbe Ansicht ist).
Vielen Dank
Wenn Sie sich also den Titel Ihrer Frage ansehen, sind Sie nicht sicher, wie Sie feststellen können, wann SearchView
geschlossen wird. Daher können Sie Ihre Ansichten nicht im normalen Zustand wiederherstellen, wenn SearchView
nicht mehr geöffnet ist.
Veraltete Lösung ab Android 4.0+
Die (einfache) Lösung besteht darin, Ihrem SearchView
ein: SearchView.OnCloseListener
hinzuzufügen, wie folgt:
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.
}
});
EDIT:
Aktualisierte Lösung für Android 4.0 und höher
Anscheinend ist OnCloseListener
fehlerhaft und funktioniert nicht mit neueren Android-Versionen (4.0+). Siehe: https://code.google.com/p/Android/issues/detail?id=25758
Die Lösung hierfür ist die Verwendung der Support-Bibliotheksversion von SearchView
:
Mein onCreateOptionsMenu
sieht so aus:
@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;
}
});
}
Warum Google sich nicht einmal die Mühe gemacht hat, einen Kommentar in die Dokumentation zu schreiben, weiß ich nicht, aber es ist traurig.
EDIT2:
Fügen Sie einfach den Link hinzu, den @MateiRadu in den Kommentaren hinzugefügt hat:
Wie gehe ich mit der Zurück-Taste der Suchansicht in Android um
Dies zeigt auch, wie Sie OnActionExpandListener
anstelle von OnCloseListener
verwenden.
Hoffe das hilft.
Die Antwort von Darwind erledigt den Job, aber das funktioniert nur, wenn der Benutzer die Zurück-Taste drückt, um die Tastatur zu schließen, und wenn SearchView
nicht mehr den Fokus hat.
Besser ist es, auf Textänderungen von SearchView
zu achten.
Auf diese Weise können Sie Ansichten wiederherstellen und die Benutzeroberfläche steuern, während der Text aktualisiert wird.
so mache ich es.
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);
}
Es gibt noch einen weiteren Trick:
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();
}
}
});