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" />
Eli Revah
quelle

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.

Matthias Räuber
quelle
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();
qbait
quelle
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);
Olayinka
quelle
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 :)

James Campbell
quelle
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.

Gunnar Bernstein
quelle
0

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

searchView.findViewById(R.id.search_button).performClick();
Santanu Sur
quelle