Wie öffne ich die SearchView programmgesteuert?


102

Es gibt dieses Widget für die ActionBar mit dem Namen 'SearchView'. Wenn es nicht verwendet wird, sieht es folgendermaßen 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 ("in Verwendung" machen).

Ich habe verschiedene Funktionen ausprobiert wie:

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

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

Aber keiner von denen hat funktioniert ...

Die Suchansicht 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" />

Antworten:


255

Erweitern Sie das SearchViewmit

searchView.setIconified(false);

und kollabieren mit

searchView.setIconified(true);

Sie müssen den Wert von android:showAsActionvon ifRoom|collapseActionViewnach ändern always. Das SearchViewAttribut 's android:iconifiedByDefaultsollte trueder Standardwert sein, andernfalls kann der Benutzer das Attribut nicht reduzieren, SearchViewnachdem es programmgesteuert erweitert wurde.


15
Hallo, eine Tastatur wird angezeigt, aber die Suchansicht wird nicht geöffnet.
Eli Revah

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

7
Mann, du bist mein Königsheld
Eliseo Ocampos

1
showAsAction = "always" zeigt jedoch nach der Rotation eine hässliche Vollbild-Suchleiste an
Francesco Gabbrielli

1
showAsAction="always"Das Suchsymbol bleibt in der Aktionsleiste, wenn es erweitert wird. Dies ähnelt nicht dem Erscheinungsbild, wenn die Suche manuell fokussiert wird.
Ixx

74

Versuchen expandActionView()Sie, MenuItem aufzurufen, nicht onActionViewExpanded () in ActionView.

Für mich geht das.

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

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

Dies ist die richtige Lösung - Die ausgewählte Lösung zwingt Sie zum Festlegen, showAsAction: alwayswas einige Probleme verursacht.
Ixx

13

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);

6

Ich weiß, das ist aber spät

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 den Fokus der Suchansicht festzulegen :)


1

Die Antwort von Matthias Robberts erweitern:

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

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ü, das ich behalte always|collapseActionView, bleibt es offen, wenn der Benutzer den Text löscht.


0

Um eine searchViewAufbewahrung close_buttonam Ende zu eröffnen, verwenden Sie diese in onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.