2013-08-05 13 views
23

Ho un SearchView funzionante che si espande nel menu Opzioni quando l'utente tocca l'icona di ricerca. Tuttavia si espande solo all'interno dello spazio disponibile tra le altre icone Menu Opzioni. Su uno schermo ampio va bene, ma con uno spazio ristretto c'è solo spazio per mostrare 5-10 caratteri nella casella di ricerca. Voglio che sovrapponga le altre icone come fa per l'app Contatti Android. Attualmente sto costruendo con targetSdkVersion = 17. Speriamo di perdere qualcosa di semplice :)SearchView in OptionsMenu not full width

(Nota aggiunta in seguito: l'unica soluzione che ho trovato finora utilizzabile è nascondere tutte le icone del menu quando voglio per espandere l'icona di ricerca, ciò è concettualmente semplice, ma è complicato perché quando si ripristinano le icone nascoste, si deve passare attraverso un po 'di logica per capire quali ripristinare, o mantenere variabili di stato, ecc.)

Ecco la mia voce xml in per l'OptionsMenu:

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

ho anche nella mia principale codice di attività:

@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)); 
} 

e

@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; 
} 

risposta

3

ho avuto un problema simile, che la barra di ricerca non riempire tutta la larghezza, (ma non avevo altre icone). ho risolto con l'aggiunta della voce:

android:actionLayout="@layout/my_search_view" 

e nel 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" /> 
+0

Questo suona ragionevole. Non ho intenzione di cambiare il codice di lavoro in questo momento, ma contrassegnerò questa risposta come corretta partendo dal presupposto che hai capito bene! –

+1

non funziona, imposta solo MaxWidth = 10000 coprirà la vista ma nasconderà altri elementi – Hiep

14

Per qualche ragione la soluzione di JJung non ha funzionato per me. Ho dovuto aggiungere android:maxWidth="10000dp", solo una larghezza massima molto elevata, per farlo espandere alla larghezza disponibile.

Inoltre, solo per aggiungere, sto usando la libreria di supporto (v7), e quindi il mio file di layout è simile al seguente:

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

E nel mio articolo, ho:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res-auto"> 
    <item 
     ... 
     myapp:actionLayout="@layout/searchview" /> 
... 

Dove myapp è solo uno spazio dei nomi arbitrario per gli attributi aggiunti dalla libreria di supporto (vedere Adding Action Items per ulteriori dettagli).

+0

Hai risolto questo problema? – Jumpa

+0

ottima questa soluzione ha funzionato anche per me. Questo è un numero arbitrale di 10000? – ThanosFisherman

+1

Questa soluzione ha funzionato per me, solo che sto usando l'elemento XML 'SearchView' invece del widget di supporto. Penso che questo dovrebbe essere contrassegnato come soluzione corretta. – qefzec

90

Invece di creare un nuovo layout ho impostato la MaxWidth di programmazione in onCreateOptionsMenu():

@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); 
    .... 
+3

searchView.setMaxWidth (Integer.MAX_VALUE); problema risolto. –

+2

Android N lo ha visualizzato correttamente (potrebbe essere stato lo schermo) ma il Nexus 6 (marshmallow) presenta questo problema. Questa soluzione funzionava per Nexus 6, mentre gli altri non avevano – behelit

+0

searchView.setMaxWidth (Integer.MAX_VALUE); risolto il problema –

1

Ci sono tanti modi per risolvere questo problema - io solo aggiungere quello che ho usato in diversi app.

ho mia abitudine SearchView (con qualche altra personalizzazione) che si estende android.support.v7.widget.SearchView e al fine di allungare per tutta la larghezza:

@Override 
public void setLayoutParams(final ViewGroup.LayoutParams params) { 
    params.width = ViewGroup.LayoutParams.MATCH_PARENT; 
    super.setLayoutParams(params); 
} 
+1

Ho provato una soluzione simile nell'emulatore Android, e non ha funzionato. Ma 'searchView.setMaxWidth (Integer.MAX_VALUE);' fatto. – CoolMind

1

forse sono in ritardo ma pensato che potrebbe essere utile per qualcuno che ha affrontato lo stesso problema come me.

final SearchView searchView = (SearchView) myActionMenuItem.getActionView(); 
searchView.setMaxWidth(Integer.MAX_VALUE);//set search menu as full width 

in onCreateOptionsMenu della vostra classe può risolvere questo problema, ma una cosa che dobbiamo capire. Se si desidera solo mostrare il menu di ricerca (facendo clic sul pulsante di ricerca) e non altre voci di menu nella barra delle azioni, è necessario mantenere l'elemento di ricerca come primo elemento nel file di menu. Ecco un esempio

 <?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> 

E sarà visualizzato come enter image description here

sulla cliccando cercatela verrà mostrato come larghezza

enter image description here

E se si mantiene di ricerca come secondo o l'ultimo elemento nel menu sarà mostrato come questo.

enter image description here

e facendo clic su Ricerca enter image description here