Un esempio di utilizzo:
Lo Spinner è a tema scuro, ma voglio che il menu a discesa sia a tema chiaro.
Un esempio di utilizzo:
Lo Spinner è a tema scuro, ma voglio che il menu a discesa sia a tema chiaro.
Risposte:
Android M
Nuovo in Android 6.0, Spinner ora ha il android:popupTheme
parametro che consente di impostare il tema utilizzato per il popup (menu a discesa).
Puoi usarlo in questo modo:
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
Funzionerà sui dispositivi che eseguono il livello API 23+, ma non sui dispositivi che eseguono una versione inferiore di Android.
AppCompat
È qui che entra in gioco AppCompat. Supporta anche la sua implementazione Spinner popupTheme
, ma è un po 'più complicato per avere ragione.
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Dopodiché, è necessario aggiornare l'adattatore per poter lavorare con AppCompat. Lo fai implementando la nuova ThemedSpinnerAdapter
interfaccia.
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
Theme getDropDownViewTheme() { ... }
void setDropDownViewTheme(Theme theme) { ... }
}
Questi metodi vengono utilizzati da Spinner per essere in grado di indicare all'adattatore quale tema utilizzare per gonfiare le visualizzazioni a discesa. Per renderlo il più semplice possibile, ti abbiamo fornito un corso Helper
che puoi collegare al tuo adattatore.
Ciò significa che il tuo adattatore diventa qualcosa come:
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
private final ThemedSpinnerAdapter.Helper mDropDownHelper;
public MyAdapter(Context context) {
mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
// Inflate the drop down using the helper's LayoutInflater
LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();
view = inflater.inflate(R.layout.my_dropdown, parent, false);
}
// ...
return view;
}
@Override
public void setDropDownViewTheme(Theme theme) {
mDropDownHelper.setDropDownViewTheme(theme);
}
@Override
public Theme getDropDownViewTheme() {
return mDropDownHelper.getDropDownViewTheme();
}
}
per la freccia dello spinner che ho usato android:backgroundTint="@color/white"
funzionerà dall'API 21
per la visualizzazione Spinner e la visualizzazione a discesa:
ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);
areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);
per getView () l'adattatore utilizzerà spinner_item.xml
per getDropDownView () l'adattatore utilizzerà dropdwon_item.xml
quindi puoi utilizzare i tuoi layout personalizzati come preferisci
spero che sia d'aiuto
Solo per riferimento, se usi l' CursorAdapter
implementazione può essere molto più semplice, basta sovrascrivere newView()
, non c'è bisogno di sovrascrivere getDropDownView()
lì:
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
puoi provare questo: nella cartella del layout crea un spinner_item.xml:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="10dp"
android:background = "#ffffff"
android:textColor="@color/primary_text"
android:textSize="@dimen/text_size_normal" />
quindi usa questo codice:
spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);