Ich entwickle eine Anwendung, bei der der Benutzer das Symbol "Suchen" in der Taste drückt ActionBar
und a SearchView
oben auf dem Bildschirm angezeigt wird.
Mein Problem ist, dass das SearchView
nicht 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?
requestFocus()
AnrufsonPrepareOptionsMenu(..)
hat den Trick für mich getan.requestFocus
funktioniert bei mir nicht Um sich zu "konzentrieren", können SiesetIconified
mitfalse
app:showAsAction="always"
. Als ich den Autofokus entfernte, verschwand das Symbol und das 3-Punkte-Symbol erschienSie 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" />
quelle
expandActionView()
direkt aufzurufen , sollten Sie stattdessen FolgendessearchMenuItem
verwenden :MenuItemCompat.expandActionView(searchMenuItem)
.searchMenuItem.expandActionView();
Wenn Sie es haben wollen, hat
iconifiedByDefault
das bei mir funktioniert.setFocusable
undsetIconified
werden 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.SearchView
das Verhalten verwenden, sind wir sehr unterschiedlich.clearFocus
wird 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();
quelle
Wenn Sie es im Layout verwenden, können Sie anrufen
mSearchView.onActionViewExpanded()
quelle
View
, nichtMenuItem
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"
quelle
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.
quelle
Das hat bei mir funktioniert:
menu.expandActionView();
quelle
Sie können die
SearchView#setIconified()
Methode für ein SearchView-Handle in Ihrem Java-Code verwenden. Mehr hier:http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)
Sie können auch nutzen
SearchView#setIconifiedByDefault()
. Mehr Infos hier:http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)
quelle
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);
quelle
Für Appcompat Searchview können Sie folgende Methode verwenden:
MenuItemCompat.expandActionView(mSearchMenuItem);
quelle
@ 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
setOnMenuItemClickListener
wie 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; } });
quelle
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
quelle
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"/>
quelle
<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>
quelle
Rufen Sie
expandActionView()
das Menüelement auf.menuItem.expandActionView()
quelle
Es fiel mir schwer, dies zu tun
SearchView widget
, aber dasexpandActionView() method
ist tatsächlich in der MenuItem-Klasse definiert, nicht in der SearchView-Klasse. Also habe ich es gelöst durchIch hoffe, es hilft. :) :)
quelle
android:iconifiedByDefault="true"
Der obige Code in XML hat mir geholfen, ihn zu erweitern und die Suchansicht automatisch zu fokussieren, wenn ich darauf klicke:
quelle