Wie schließe ich eine SearchView programmgesteuert?

Lesezeit: 5 Minuten

Benutzer-Avatar
Tim

Ich habe derzeit eine SearchView in der Aktionsleiste meiner App. Wenn ich auf das Suchsymbol klicke, wird die SearchView erweitert und die Tastatur erscheint wie erwartet. Klicken Sie auf das “X” in der SearchView Box schließt die SearchView wie erwartet. Wenn jedoch die SearchView aktiviert ist und ich den “Zurück”-Button drücke, wird meine App beendet. Dies ist das richtige Verhalten, aber was ich jetzt versuche, ist, das Drücken der Zurück-Taste zu erfassen und es einfach schließen zu lassen SearchView (nicht meine App) wenn die SearchView ist sichtbar. Gibt es eine Möglichkeit, die aufzurufen SearchView OnCloseListener() programmgesteuert bei einem Zurück-Tastendruck? Zum Beispiel so etwas:

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}

  • stackoverflow.com/a/46930606/1308990

    – oiyio

    25. Oktober 2017 um 10:58 Uhr

Basierend auf der Antwort von @MarcinOrlowski können Sie auch Folgendes verwenden:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}

  • Wichtig, die obige Lösung funktioniert nicht, wenn Sie app:showAsAction=”always” eingestellt haben.

    – BenutzerK

    12. Juni 2017 um 15:47 Uhr

  • Achten Sie darauf, searchView.setQuery(“”, false) festzulegen; um searchView.setIconified(true) zu machen; arbeiten

    – Pushan

    3. Januar 2018 um 10:08 Uhr


  • mit searchView.setQuery(“”, false); vor searchView.setIconified(true); funktionierte für mich, auch wenn Sie 2 aufeinanderfolgende searchView.setIconified(true) setzen; hat bei mir funktioniert.

    – Ahmed Nezhi

    4. Juni 2021 um 14:04 Uhr

Benutzer-Avatar
betorcs

Verwenden

searchView.setIconified(true)

habe ich auch benutzt MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)

BEARBEITET

Diese Methode wurde in API-Level 26.1.0 als veraltet markiert. Verwenden Sie collapseActionView() direkt.

MenuItem#collapseActionView()

  • Dies funktioniert nur, wenn Sie app:showAsAction=”ifroom|collapseActionView” festlegen.

    – Joan Casadellà

    14. Oktober 2015 um 9:32 Uhr

  • Ist jetzt veraltet, verwenden Sie collapseActionView() direkt für das MenuItem

    – 4bottiglie

    4. April 2021 um 11:22 Uhr

Benutzer-Avatar
Blauwaren

Dazu gibt es eine einfache Möglichkeit:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

oder verwenden:

myToolBar.collapseActionView();

Dadurch wird die Suchansicht zusammengeklappt, bevor Sie die Zurück-Taste drücken, dann wird die Zurück-Aktion aufgerufen.

Beide Lösungen werden funktionieren.

  • collapseActionView funktioniert nicht, die erste Lösung ja

    – Frank

    28. September 2020 um 10:13 Uhr

das ist das einzige, was es für mich tut:

  toolbar.collapseActionView();

Benutzer-Avatar
Marcin Orlowski

Zum Überschreiben der BACK-Taste abfangen onBackPressed() (siehe Dokumente)

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

BEARBEITEN:

Docs sagen:

Bei Bedarf können Sie die Aktionsansicht in Ihrem eigenen Code erweitern oder reduzieren, indem Sie expandActionView() und collapseActionView() für das MenuItem aufrufen.

  • Danke für die Antwort! Was mich jedoch hauptsächlich interessiert, ist, ob es eine Möglichkeit gibt, das Close-Ereignis einer SearchView programmgesteuert aufzurufen, dh ein SearchView-Feld “X” im Code zu imitieren.

    – Tim

    6. Juli 2013 um 19:28 Uhr

  • Danke für all die Hilfe Marcin. Es stellte sich heraus, dass ich eigentlich meine Suchaktionsansicht “ikonifizieren” wollte (meine Suchansicht befindet sich immer in der Aktionsleiste und wird nie in das Optionsmenü eingeblendet). Vielen Dank, dass Sie sich die Zeit genommen haben, mir zu helfen, und danke für den Tipp zum Überschreiben von „onBackPressed“.

    – Tim

    6. Juli 2013 um 22:26 Uhr

  • Bei mir heißt onBackPressed nicht. welche andere Lösung habe ich? Ich habe versucht, den Fokus auf die Suchansicht zu hören, aber das heißt auch nicht.

    – Ionut Negru

    15. Januar 2014 um 21:12 Uhr

  • Sie erwarten nicht onBackPressed() außerhalb von Activity (dh in Fragment), nicht wahr?

    – Marcin Orlowski

    15. Januar 2014 um 21:38 Uhr

  • Für mich wird onBackPressed überhaupt nicht aufgerufen. Es scheint, dass die Suchansicht tatsächlich die hintere Presse auffrisst und damit umgeht. Zum Beispiel sehe ich, dass onMenuItemActionViewCollapsed() aufgerufen wird, aber onBackPressed nicht aufgerufen wird. Wie kann ich das überschreiben? Ich habe sogar versucht, einen Key Listener in der Suchansicht festzulegen, und es funktioniert immer noch nicht.

    – Ashok SoThree

    25. April 2014 um 21:27 Uhr

Benutzer-Avatar
DoruChidean

wenn Sie Eingaben zu Ihrer Suchansicht haben

mSearchView.setIconified(true);

löscht nur den Text.

Die richtige Methode zum Schließen einer searchView ist

mSearchView.onActionViewCollapsed();

  • Danke für die Antwort! Was mich jedoch hauptsächlich interessiert, ist, ob es eine Möglichkeit gibt, das Close-Ereignis einer SearchView programmgesteuert aufzurufen, dh ein SearchView-Feld “X” im Code zu imitieren.

    – Tim

    6. Juli 2013 um 19:28 Uhr

  • Danke für all die Hilfe Marcin. Es stellte sich heraus, dass ich eigentlich meine Suchaktionsansicht “ikonifizieren” wollte (meine Suchansicht befindet sich immer in der Aktionsleiste und wird nie in das Optionsmenü eingeblendet). Vielen Dank, dass Sie sich die Zeit genommen haben, mir zu helfen, und danke für den Tipp zum Überschreiben von „onBackPressed“.

    – Tim

    6. Juli 2013 um 22:26 Uhr

  • Bei mir heißt onBackPressed nicht. welche andere Lösung habe ich? Ich habe versucht, den Fokus auf die Suchansicht zu hören, aber das heißt auch nicht.

    – Ionut Negru

    15. Januar 2014 um 21:12 Uhr

  • Sie erwarten nicht onBackPressed() außerhalb von Activity (dh in Fragment), nicht wahr?

    – Marcin Orlowski

    15. Januar 2014 um 21:38 Uhr

  • Für mich wird onBackPressed überhaupt nicht aufgerufen. Es scheint, dass die Suchansicht tatsächlich die hintere Presse auffrisst und damit umgeht. Zum Beispiel sehe ich, dass onMenuItemActionViewCollapsed() aufgerufen wird, aber onBackPressed nicht aufgerufen wird. Wie kann ich das überschreiben? Ich habe sogar versucht, einen Key Listener in der Suchansicht festzulegen, und es funktioniert immer noch nicht.

    – Ashok SoThree

    25. April 2014 um 21:27 Uhr

Benutzer-Avatar
vishalsehgal

Keine Notwendigkeit zu verwenden onBackPressed() Methode dafür!! Ich habe die Lösung gefunden, nur wie ich es unten erwähnt habe, damit der SearchView selbst das handhabt beim Drücken der Zurück-Taste Veranstaltung.

In Ihrem onCreateOptionsMenu() Methode,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

In deiner menu.xml hinzufügen showAsAction -Attribut und legen Sie seine Werte fest als "always|collapseActionView"

<item
    android:id="@+id/action_search_item"
    android:title="Search"
    android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"/>

Und schon kann es losgehen 😉

PS – Ich habe lange nach einer Lösung gesucht und jetzt habe ich eine gefunden, hoffe es hilft euch allen.

1282290cookie-checkWie schließe ich eine SearchView programmgesteuert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy