wake-up-neo.com

Wie kann ich den SearchView-Knopfdruck erkennen?

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

11
bdristan

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.

30
Darwind

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

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