Erweitern Sie SearchView automatisch und konzentrieren Sie sich darauf


74

Ich entwickle eine Anwendung, bei der der Benutzer das Symbol "Suchen" in der Taste drückt ActionBarund a SearchViewoben auf dem Bildschirm angezeigt wird.

Mein Problem ist, dass das SearchViewnicht scharfgestellt oder erweitert ist, so dass der Benutzer die Suchtaste auf drücken muss Searchview, um es zu erweitern und die Tastatur herauszuholen.

Wie soll das gelöst werden?

Antworten:


96

Um die SearchView standardmäßig zu erweitern, rufen Sie setIconifiedByDefault (false) auf, wenn Sie sie initialisieren (z . B. in onCreateOptionsMenu(..)oder onPrepareOptionsMenu(..)). Ich habe in den meisten Fällen festgestellt, dass dies automatisch den Fokus gibt, aber wenn nicht, rufen Sie requestFocus()es einfach auch auf.


5
Ich bin mir nicht sicher, ob ich ehrlich bin.
Alex Curran

8
Das Hinzufügen eines requestFocus()Anrufs onPrepareOptionsMenu(..)hat den Trick für mich getan.
Der schmutzige Calvinist

3
requestFocusfunktioniert bei mir nicht Um sich zu "konzentrieren", können Sie setIconifiedmitfalse
Peterchaula

1
@SweSnow Sie müssen beide festlegen ... searchView.setIconifiedByDefault (false); searchView.requestFocus ();
Pallav Bohara

3
Stellen Sie sicher, dass Sie die Menüelement-Eigenschaft festgelegt haben app:showAsAction="always". Als ich den Autofokus entfernte, verschwand das Symbol und das 3-Punkte-Symbol erschien
Riccardo Bonesi

113

Sie können auch die expandActionView () -Methode aufrufen, um sie zu erzwingen:

@Override
public boolean onCreateOptionsMenu( Menu menu )
{
    super.onCreateOptionsMenu( menu );

    MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
    searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query

    return true;
}

Suchelement im Layout der Aktionsleiste:

<item
        android:id="@+id/mi_search"
        android:icon="@drawable/abs__ic_search_api_holo_light"
        android:title="@string/search"
        android:showAsAction="ifRoom|collapseActionView"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        />

47
Wenn Sie AppCompat verwenden , anstatt dies expandActionView()direkt aufzurufen , sollten Sie stattdessen FolgendessearchMenuItem verwenden : MenuItemCompat.expandActionView(searchMenuItem).
Charles Madere

@ CharlesMadere Weg ist der einzige, der für mich funktioniert hat, API 23
Matteo

plus 1 fürsearchMenuItem.expandActionView();
Vlad

2
MenuItemCompat.expandActionView (searchMenuItem) ist jetzt veraltet
Luckyhandler

Diese Lösung ist veraltet.
Felix Favor Chinemerem

55

Wenn Sie es haben wollen, hat iconifiedByDefaultdas bei mir funktioniert. setFocusableund setIconifiedwerden benötigt.

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconifiedByDefault(true);
    searchView.setFocusable(true);
    searchView.setIconified(false);
    searchView.requestFocusFromTouch();

Update: Wenn Sie android.support.v7.widget.SearchViewdas Verhalten verwenden, sind wir sehr unterschiedlich. clearFocuswird benötigt, wenn das Tastatur-Popup nicht ständig angezeigt werden soll. Aus irgendeinem Grund wird das Menü bei Verwendung von appcompat ständig neu erstellt.

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();

25

Wenn Sie es im Layout verwenden, können Sie anrufen

mSearchView.onActionViewExpanded()


Was bedeutet die Verwendung im Layout?
Pascalius

3
Ich meine, dass Sie es als View, nichtMenuItem
riwnodennyk

das hat bei mir nicht funktioniert. Das Aufrufen von setIconified () war jedoch möglich.
MrPlow

Ich habe nicht sicher, warum sie auf der offiziellen Website nicht im Beispielcode enthalten sind. Ich meine, wenn ich auf die Suchschaltfläche klicke, sollte sich die Tastatur richtig öffnen ???
Tushar Srivastava

8

Das hat bei mir funktioniert:

Im Root-Layout:

xmlns:app="http://schemas.android.com/apk/res-auto"

SearchView wie folgt definiert:

 <android.support.v7.widget.SearchView
        android:id="@+id/search_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_margin="15dp"
        android:background="@drawable/search_view"        
        app:iconifiedByDefault="false"
        app:queryHint="Search name or email"
        >

        <requestFocus />
    </android.support.v7.widget.SearchView>

Der Unterschied liegt im App-Tag.

app:iconifiedByDefault="false"
app:queryHint="Search name or email"

6

Wenn Sie innerhalb einer Aktivität verwenden, müssen Sie verwenden

view.onActionViewExpanded();

Wenn Sie Menüoptionen verwenden, müssen Sie diese verwenden

MenuItem.expandActionView();

Hinweis: Es funktioniert nur für SearchView

Diese beiden Situationen sind für mich gearbeitet.




2

benutze das

SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
                SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
                searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
                searchView.setIconifiedByDefault(false);
                searchView.setQueryHint("Search");
                menu.findItem(R.id.action_search).setActionView(searchView);

2

Für Appcompat Searchview können Sie folgende Methode verwenden:

MenuItemCompat.expandActionView(mSearchMenuItem);

1

@ Pascalius 'Antwort hat bei mir funktioniert. Aber jedes Mal, wenn Sie die Suchansicht schließen und erneut klicken, haben Sie den Fokus verloren. Also habe ich den Code setOnMenuItemClickListenerwie folgt eingefügt :

MenuItem item = menu.findItem(R.id.action_search);

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();

item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
        searchView.setIconifiedByDefault(true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();

        return false;
    }
});

0

Die SearchView von MenuItemCompat verfügt über eine Eigenschaft namens maxWidth.

final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);

Verwenden Sie die Bildschirmbreite anstelle von xxx offcourse


0

Ich verwende android.widget Searchview und bin standardmäßig symbolisiert. Der folgende Code in XML hat mir geholfen, ihn zu erweitern und in der Suchansicht automatisch zu fokussieren, wenn ich darauf klicke:

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:iconifiedByDefault="true"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:queryHint="Search"/>

0

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

<pre>

 <item
        android:id="@+id/search"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always"/>

 public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_menu, menu);
        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Search the customer...");
        searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setIconifiedByDefault(false);
        searchView.requestFocus();

    }

</pre>


Es funktioniert erfolgreich für mich, so dass Sie es versuchen können.
Chandan Raj


0

Es fiel mir schwer, dies zu tun SearchView widget, aber das expandActionView() methodist tatsächlich in der MenuItem-Klasse definiert, nicht in der SearchView-Klasse. Also habe ich es gelöst durch

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView   searchView = (SearchView) searchItem.getActionView();
        searchItem.expandActionView();

Ich hoffe, es hilft. :) :)


-2

android:iconifiedByDefault="true"

Der obige Code in XML hat mir geholfen, ihn zu erweitern und die Suchansicht automatisch zu fokussieren, wenn ich darauf klicke:

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.