2012-01-20 19 views
29

Mi piacerebbe che la mia app avesse una Spinner che allunga l'intera lunghezza della mia ActionBar, come quella di Gmail 4.0. Qualcuno sa come raggiungerlo? Anche se imposto "match_parent" nella risorsa di layout Spinner, non riempie l'intera barra. Preferibilmente, mi piacerebbe essere in grado di riempire l'intera barra eccetto i miei elementi di azione, piuttosto che usare anche la barra delle azioni divisa.Spinner a tutta larghezza in ActionBar

EDIT: vedere la mia risposta qui sotto per un'implementazione utilizzando il built-in ActionBar, o hankystyles' quando si utilizza una visualizzazione personalizzata

enter image description here

+0

Come su paddings - la risorsa immagine per il pulsante stesso include un po 'di padding? – Scalarr

+0

Hai impostato più account? Il mio si estende anche a destra come il tuo, ma penso che sia principalmente perché ho diversi account impostati. Il contenuto del "menu a discesa" (o come si chiama) è quindi diverso e più ampio. – hnilsen

+1

sì, ho creato 2 account. È piuttosto strano averlo diverso a seconda di quanti account hai! –

risposta

28

Bit fastidioso di averlo appena fatto, ma ecco un metodo per farlo usando lo Spinner incorporato nella barra delle azioni. Tutto quello che dovete fare è rendere il contenitore principale del tuo articolo filatore un RelativeLayout e impostare la sua gravità per fillHorizontal, in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout1" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:gravity="fill_horizontal" 
android:orientation="vertical" > 

<TextView 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginBottom="-4dip" 
    android:text="@string/gen_placeholder" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/TextView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@android:id/text1" 
    android:text="@string/app_name" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

</RelativeLayout> 

E inizializzazione l'adattatore come così:

ArrayAdapter<CharSequence> barAdapter = new ArrayAdapter<CharSequence>(this, R.layout.subtitled_spinner_item, 
    android.R.id.text1, getResources().getStringArray(R.array.actionList)); 
barAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

che poi dà la necessaria filatore che copre l'intero ActionBar (tranne che per i pulsanti di azione):

Spanned actionbar

+1

Puoi espandere ciò che intendi impostando il "contenitore principale" dell'articolo dello spinner? Qualche possibilità di dare un esempio di come hai aggiunto il layout di cui sopra? – brk3

+0

Intendo il layout che racchiude il tuo oggetto spinner. Il codice xml sopra genera lo spinner a larghezza intera come mostrato. –

+0

Quindi hai bisogno di un adattatore personalizzato per andare con questo? – brk3

19

La filatrice sul mio gmail app si estende anche l'intera larghezza della mia barra delle azioni. Questa soluzione ha funzionato per me:

View spinner = getLayoutInflater().inflate(R.layout.actionbar_spinner, null); 
actionBar.setCustomView(spinner); 
actionBar.setDisplayShowCustomEnabled(true); 

Dove il layout filatore è in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="fill_horizontal" > 
    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/spinner_text" 
    /> 
</RelativeLayout> 

Ho il sospetto che ci sia una soluzione migliore per essere avuto sovrascrivendo nella barra delle operazioni di navigazione di stile predefinito like this ma non potevo' t ottenerlo immediatamente funzionante

+0

ah geniale, grazie. Preferirei un'implementazione che utilizza i controlli di navigazione standard (ad esempio, non una visualizzazione personalizzata), ma se nessuno me ne dà uno alla fine, assegnerò la taglia. –

0

Provare a impostare lo sfondo dello spinner su un file immagine. Lo sfondo di default mi ha causato problemi di layout, ma quando l'ho impostato sul mio png di un pixle vuoto 1x1 ha riempito il mio layout come volevo. Se funziona, potresti dover creare un'immagine personalizzata che funzioni per te. Spero che aiuti.

0

Se si dispone di un TextVie w all'interno del tuo Spinner, puoi impostare i minEms su un valore elevato. Questa è la soluzione più semplice che ho esplorato:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_vertical"> 

    <TextView 
     android:id="@+id/spinner_active" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:text="blaa" 
     android:minEms="100" 
     android:textSize="20sp" /> 

</LinearLayout> 
Problemi correlati