Ich habe eine funktionierende Suchansicht, die in meinem Optionsmenü erweitert wird, wenn der Benutzer auf das Suchsymbol tippt. Es wird jedoch nur innerhalb des verfügbaren Platzes zwischen den anderen OptionsMenu-Symbolen erweitert. Auf einem Breitbildschirm ist dies in Ordnung, aber mit einem engen Platz können im Suchfeld nur 5-10 Zeichen angezeigt werden. Ich möchte, dass die anderen Symbole wie bei der Android-Kontakte-App überlagert werden. Derzeit baue ich mit targetSdkVersion = 17 auf. Hoffentlich fehlt mir etwas einfaches :)
(Anmerkung später hinzugefügt: Die einzige Lösung, die ich bisher als brauchbar gefunden habe, ist das Ausblenden aller Menüsymbole, wenn das Suchsymbol erweitert werden soll. Dies ist konzeptionell einfach. Aber es ist unordentlich, denn beim Wiederherstellen von ausgeblendeten Symbolen hat man dies eine Reihe von Logik durchlaufen, um herauszufinden, welche wiederhergestellt werden sollen, oder um Zustandsvariablen zu behalten usw.)
Hier ist mein Artikel xml für das Optionsmenü:
<item
Android:id="@+id/menu_search_shallow"
Android:title="Search Current Folder"
Android:icon="@drawable/ic_btn_search"
Android:showAsAction="always|collapseActionView"
Android:actionViewClass="Android.widget.SearchView" />
Ich habe auch in meinem Hauptaktivitätscode:
@Override
public boolean onCreateOptionsMenu (Menu menu)
{
getMenuInflater().inflate(R.menu.nav_menu, menu);
this.optionsMenu = menu;
MenuItem searchItem = menu.findItem (R.id.menu_search_shallow);
searchItem.setOnActionExpandListener (this);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint (getString (R.string.search_shallow_hint));
searchItem = menu.findItem (R.id.menu_search_deep);
searchItem.setOnActionExpandListener (this);
searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint (getString (R.string.search_deep_hint));
}
und
@Override
public boolean onMenuItemActionExpand(MenuItem item)
{
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener (this);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item)
{
SearchView searchView = (SearchView) item.getActionView();
searchView.setQuery ("", false);
return true;
}
Ich hatte ein ähnliches Problem, dass die Suchleiste nicht die gesamte Breite ausfüllte (aber ich hatte keine anderen Symbole). Ich löste es durch Hinzufügen in item:
Android:actionLayout="@layout/my_search_view"
und in layout/my_search_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
Anstatt ein neues Layout zu erstellen, habe ich MaxWidth programmgesteuert in onCreateOptionsMenu () festgelegt:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search, menu);
SearchView searchView = (SearchView)menu.findItem(R.id.menu_search).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
....
Aus irgendeinem Grund funktionierte die Lösung von Jjung nicht für mich. Ich musste Android:maxWidth="10000dp"
hinzufügen, nur eine wirklich hohe maxWidth, damit es auf die volle verfügbare Breite erweitert wird.
Nur zum Hinzufügen verwende ich die Unterstützungsbibliothek (v7), und meine Layoutdatei sieht folgendermaßen aus:
<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:maxWidth="10000dp" />
Und in meinem Artikel habe ich:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:myapp="http://schemas.Android.com/apk/res-auto">
<item
...
myapp:actionLayout="@layout/searchview" />
...
Dabei ist myapp
nur ein beliebiger Namensraum für die von der Support-Bibliothek hinzugefügten Attribute (siehe Hinzufügen von Aktionselementen für weitere Details).
Vielleicht komme ich zu spät, dachte aber, es könnte für jemanden hilfreich sein, der das gleiche Problem hatte wie ich.
final SearchView searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);//set search menu as full width
in onCreateOptionsMenu
Ihrer Klasse kann dieses Problem gelöst werden, aber eines müssen wir verstehen. Wenn Sie nur das Suchmenü anzeigen möchten (durch Klicken auf die Suchschaltfläche) und nicht alle anderen Menüelemente in der Aktionsleiste, müssen Sie das Suchelement als ersten Eintrag in der Menüdatei beibehalten. Hier ist ein Beispiel
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<!--keeping searach as first item-->
<item
Android:id="@+id/action_search"
Android:icon="@drawable/search_ab"
Android:title="@string/search"
app:actionViewClass="Android.support.v7.widget.SearchView"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/itemFilter"
Android:icon="@drawable/filter"
Android:title="@string/filter"
app:showAsAction="ifRoom" />
</menu>
wenn Sie auf Suchen klicken, wird die gesamte Breite angezeigt
Wenn Sie als zweites oder letztes Element im Menü suchen, wird es so angezeigt.
Es gibt so viele Möglichkeiten, dieses Problem zu lösen - ich füge einfach die hinzu, die ich in verschiedenen Apps verwendet habe.
Ich habe mein benutzerdefiniertes SearchView (mit einigen anderen Anpassungen), das Android.support.v7.widget.SearchView erweitert, um sich auf volle Breite auszudehnen:
@Override
public void setLayoutParams(final ViewGroup.LayoutParams params) {
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
super.setLayoutParams(params);
}
So verrückt wie es scheinen mag, das Problem war in meinem Fall folgende Zeile: app: actionViewClass = "Android.widget.SearchView" in menu.xml:
<item
Android:id="@+id/action_search"
app:actionViewClass="Android.widget.SearchView"
Android:icon="@drawable/ic_search"
Android:title="@string/title"
app:actionLayout="@layout/layout_search"
app:showAsAction="always" />
Wenn ich app: actionViewClass entfernte, wurde es vollständig erweitert, wie in meiner Datei layout_search definiert.
<Android.support.v7.widget.SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxWidth="10000dp"
Android:layout_centerInParent="true"
Android:background="@color/colorAccent"
Android:queryHint="Search me" />