2012-04-25 10 views
12

C'è un modo per creare un Dropdown Spinner per Android 2.3.3? Sto usando ActionbarSherlock.Dropdown Dropner al di fuori della barra delle azioni? (Stile IceCream Sandwich, con ActionBarSherlock)

Ecco un esempio di quello che voglio dire:

enter image description here

Grazie

+0

Che ne dici di Dropdown [Spinner] (http://developer.android.com/reference/android/widget/Spinner.html) che è stato utilizzato dall'API 1? I temi potrebbero essere diversi, ma dovresti essere in grado di copiarne la maggior parte in un tema personalizzato. – Sam

+0

Intende il look and feel degli spinners ICS, dove "scendono" invece di essere un dialogo. – dmon

risposta

26

Così com'è, siete fortunati. Può essere fatto con ActionBarSherlock e funziona con le versioni precedenti alla 4.0. Tuttavia, non sono sicuro al 100% che Jake Wharton vorrà che lo usiamo in questo modo, dal momento che non è esattamente "ape pubblica", AFAIK (volevo chiedere). In ogni caso, è necessario creare prima la propria classe di estendere dalla classe ActionBarSherlock:

public class MyIcsSpinner extends IcsSpinner { 

    public MyIcsSpinner(Context context, AttributeSet attrs) { 
    super(context, attrs, com.actionbarsherlock.R.attr.actionDropDownStyle); 

    } 

    public MyIcsSpinner(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    } 
} 

per includerlo in un layout:

<com.blah.blah.blah.MyIcsSpinner 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:textAllCaps="true" 
    android:background="@drawable/abs__spinner_ab_holo_light" 
    android:textColor="#000000" 
    android:gravity="center"/> 

Ora è necessario creare un costume SpinnerAdapter, ed hai bisogno per sovrascrivere i seguenti metodi per ottenere l'aspetto corretto:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    final TextView filterName; 
    if (convertView == null) { 
     filterName = (TextView) layoutInflater.inflate(R.layout.filter_item, parent, false); 
    } else { 
     filterName = (TextView) convertView; 
    } 

    filterName.setText(getItem(position)); 
    return filterName; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    final TextView filterName; 
    if (convertView == null) { 
     filterName = (TextView) layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, parent, false); 
     filterName.setEllipsize(TruncateAt.END); 
    } else { 
     filterName = (TextView) convertView; 
    } 

    filterName.setText(getItem(position)); 
    return filterName; 
    } 

YMMV, esp. per quanto riguarda i temi.

+0

Grazie, Funziona alla grande! –

+0

@dmon La larghezza del menu a discesa non viene modificata dopo la rotazione del dispositivo. Potresti suggerire su questo? –

1

Ho incontrato lo stesso problema e la mia soluzione è abbastanza semplice. (Non ho usato HoloEverywhere.)

L'idea viene dal progetto di esempio ABS, il cui menu a discesa può essere visualizzato anche sui dispositivi precedenti alla 4.0 utilizzando un sottomenu. Quindi, la mia idea è usare un sottomenu per mascherare l'icona a 3 punti. Ecco il codice:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    SubMenu sub = menu.addSubMenu("More"); 
    sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
    sub.getItem().setIcon(R.drawable.ic_menu); 

    getSupportMenuInflater().inflate(R.menu.activity_main, sub); 

    return true; 
} 

Dal momento che il menu "Altro" non ha un attributo MenuItem.SHOW_AS_ACTION_WITH_TEXT, così la parola "More" (o quello che di nome) sarà effettivamente non essere visualizzato sulla barra delle operazioni. L'unica icona visualizzata R.drawable.ic_menu può essere copiata da cartelle di codice sorgente ABS res/drawable-xxdpi denominate "abs__ic_menu_moreoverflow_normal_holo_dark.png", che è la cosiddetta icona a 3 punti. E il R.menu.activity_main è il tuo menu xml.

Funziona!

Problemi correlati