Odpowiedzi:
Android M.
Nowość w systemie Android 6.0, Spinner ma teraz android:popupTheme
parametr, który pozwala ustawić motyw używany dla wyskakującego okienka (menu rozwijanego).
Możesz go używać tak:
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
Będzie to działać na urządzeniach z poziomem API 23+, ale nie na urządzeniach z niższą wersją Androida.
AppCompat
W tym miejscu pojawia się AppCompat. Jego implementacja Spinner również obsługuje popupTheme
, ale jest nieco bardziej zaangażowana, aby uzyskać właściwą.
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Następnie musisz zaktualizować swój adapter, aby móc pracować z AppCompat. Robisz to, wdrażając nowy ThemedSpinnerAdapter
interfejs.
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
Theme getDropDownViewTheme() { ... }
void setDropDownViewTheme(Theme theme) { ... }
}
Spinner używa tych metod, aby móc wskazać adapterowi, którego motywu użyć do zawyżenia dowolnych rozwijanych widoków. Aby było to tak proste, jak to tylko możliwe, przygotowaliśmy Helper
klasę, którą możesz podłączyć do adaptera.
Oznacza to, że twój adapter staje się czymś takim:
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();
}
}
dla strzały obrotowej, której użyłem, android:backgroundTint="@color/white"
będzie działać z API 21
dla widoku pokrętła i widoku rozwijanego:
ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);
areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);
dla getView () adapter użyje spinner_item.xml
dla getDropDownView () adapter użyje dropdwon_item.xml
wtedy możesz dowolnie używać własnych układów
mam nadzieję, że to pomoże
Tylko w celach informacyjnych, jeśli używasz CursorAdapter
swojej implementacji, może być znacznie łatwiejsze, po prostu zastąp newView()
, nie ma potrzeby zastępowania w tym getDropDownView()
miejscu:
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
możesz spróbować tego: w folderze układu utwórz 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" />
następnie użyj tego kodu:
spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);