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?

SweSnow
quelle

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.

Alex Curran
quelle
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"
        />
JavierCane
quelle
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();
Pascalius
quelle
25

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

mSearchView.onActionViewExpanded()

riwnodennyk
quelle
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"
Parth mehta
quelle
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.

Saibaba Vali
quelle
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);
manish poddar
quelle
2

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

MenuItemCompat.expandActionView(mSearchMenuItem);
Javier
quelle
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;
    }
});
Cesar Rodriguez
quelle
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

Wops
quelle
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"/>
DISHA
quelle
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>

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

Rufen Sie expandActionView()das Menüelement auf.

menuItem.expandActionView()
Felix Favor Chinemerem
quelle
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. :) :)

Nasib
quelle
-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:

Nikhil Dinesh
quelle