Wie öffne ich die SearchView programmgesteuert?

Lesezeit: 4 Minuten

Benutzer-Avatar
Eli Rewa

Es gibt dieses Widget für die ActionBar, das “SearchView” heißt. Wenn es nicht verwendet wird, sieht es so aus:

Geben Sie hier die Bildbeschreibung ein

Und wenn es verwendet wird, sieht es so aus:

Geben Sie hier die Bildbeschreibung ein

Ich möchte (natürlich programmgesteuert) die Suchansicht öffnen (sie “in Gebrauch” machen).

Ich habe mehrere Funktionen ausprobiert, z.

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

Aber nichts davon hat funktioniert…

Die SearchView im XML:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

Benutzer-Avatar
Matthias Räuber

Erweitere das SearchView mit

searchView.setIconified(false);

und kollabieren Sie es mit

searchView.setIconified(true);

Sie müssen den Wert von ändern android:showAsAction aus ifRoom|collapseActionView zu always. Das SearchView‘s Attribut android:iconifiedByDefault sollte sein truewas der Standardwert ist, andernfalls kann der Benutzer die nicht reduzieren SearchView nachdem es programmatisch erweitert wurde.

  • Hallo, eine Tastatur wird angezeigt, aber die Suchansicht wird nicht geöffnet.

    – Eli Rewa

    9. Januar 2013 um 13:21 Uhr


  • Hallo, das hat auch nicht funktioniert. Ich habe den Beitrag mit dem XML-Quellcode aktualisiert.

    – Eli Rewa

    9. Januar 2013 um 13:35 Uhr

  • Mann, du bist mein verdammter Held

    – Eliseo Ocampos

    14. Juli 2017 um 16:50 Uhr

  • showAsAction=”always” zeigt jedoch nach der Drehung eine hässliche Vollbild-Suchleiste an

    – Francesco Gabbrelli

    25. Februar 2018 um 1:01 Uhr

  • showAsAction="always" bewirkt, dass das Suchsymbol in der Aktionsleiste bleibt, wenn es erweitert ist, was nicht dem Aussehen ähnelt, wenn die Suche manuell fokussiert wird.

    – Benutzer

    30. April 2018 um 8:19 Uhr

Versuchen anzurufen expandActionView() auf MenuItem, nicht auf ActionViewExpanded() auf ActionView.

Für mich geht das.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

  • Funktioniert perfekt, aber nur für API > 14. Für frühere APIs können Sie Folgendes verwenden: MenuItemCompat.expandActionView(searchMenuItem);

    – Andrej Aulaska

    29. Mai 2014 um 8:21 Uhr


  • Dies ist die richtige Lösung – Die ausgewählte Lösung zwingt Sie zum Einstellen showAsAction: always was einige Probleme verursacht.

    – Benutzer

    30. April 2018 um 8:24 Uhr

Benutzer-Avatar
Olayinka

Wenn Sie die Support-Bibliothek nur bei Bedarf verwenden möchten, tun Sie dies

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

sonst mach das einfach

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

Ich weiß, das ist spät, aber

Versuchen Sie, expandActionView() aufzurufen, um es zu öffnen, und collapseActionView(), um es zu schließen. Sie können requestFocus() in der aktuellen Aktionsansicht über getActionView() aufrufen, um der Suchansicht den Fokus zu geben 🙂

Zum androidx.appcompat.widget.SearchView,

searchView.setIconifiedByDefault(true)   // didn't work

searchMenuItem.expandActionView()  // didn't work

MenuItemCompat.expandActionView(searchMenuItem) // didn't work

searchView.onActionViewExpanded()  // didn't work

Folgendes hat bei mir funktioniert,

searchView.findViewById<View>(R.id.search_button).performClick()

  • Solltest du lieber verwenden searchView.setIconified(false) um die Suchansicht zu erweitern

    – fm-sys

    16. Oktober 2021 um 8:06 Uhr

Benutzer-Avatar
Gunnar Bernstein

Erweiterung der Antwort von Matthias Robberts:

Ich wollte, dass ein Listenfragment seinen Suchwert beibehält und ihn festlegt, nachdem der Benutzer von einem anderen Fragment zurückkehrt.

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

und für das Menü behalte ich always|collapseActionViewandernfalls bleibt es geöffnet, wenn der Benutzer den Text löscht.

  • Solltest du lieber nutzen searchView.setIconified(false) um die Suchansicht zu erweitern

    – fm-sys

    16. Oktober 2021 um 8:06 Uhr

Benutzer-Avatar
Wjatscheslaw Truschin

Ich habe nach einer Lösung gesucht, um SearchView programmgesteuert zu erweitern, da ich den Erweiterungsstatus wiederherstellen muss. Keine Lösung wurde für mich gearbeitet. Außer mit Handler().post(). Ich weiß, dass es keine gute Praxis ist, post() zu verwenden. Aber ich arbeite an einem Legacy-Projekt und diese Problemumgehung ist für mich akzeptabel.

Variablenblock initialisieren

val searchMenuItem = menu.findItem(R.id.menu_search_item)
val searchView = searchMenuItem.actionView as SearchView

So erweitern Sie SearchView:

Handler().post {
   searchMenuItem.expandActionView()
}

Grund, warum post() hilft: Wenn Ihre App nicht gut geschrieben ist, macht sie möglicherweise zu viel Arbeit im UI-Thread. post() stellt sicher, dass Ihr Codeblock ausgeführt wird, wenn der UI-Thread zur Ausführung verfügbar ist. Das heißt, wenn Sie diese Problemumgehung verwenden, können Sie eine kleine Verzögerung zwischen der Erweiterung von SearchView feststellen

1311700cookie-checkWie öffne ich die SearchView programmgesteuert?

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

Privacy policy