wake-up-neo.com

SearchView in OptionsMenu nicht in voller Breite

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;
}
31
Peri Hartman

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" />
3
jjung

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);
    ....
106
clu

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).

15
mchristie

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>

Und es wird angezeigt als  enter image description here

wenn Sie auf Suchen klicken, wird die gesamte Breite angezeigt

 enter image description here

Wenn Sie als zweites oder letztes Element im Menü suchen, wird es so angezeigt.

 enter image description here

und beim Klicken auf Suchen  enter image description here

4

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);
}
1
Oleksandr

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" />
0
daneejela