Ein Anwendungsbeispiel:
Der Spinner hat ein dunkles Thema, aber ich möchte, dass das Dropdown-Thema hell ist.
Ein Anwendungsbeispiel:
Der Spinner hat ein dunkles Thema, aber ich möchte, dass das Dropdown-Thema hell ist.
Antworten:
Android M.
Spinner ist neu in Android 6.0 und verfügt nun über den android:popupTheme
Parameter, mit dem Sie das für das Popup verwendete Thema (Dropdown) festlegen können.
Sie können es so verwenden:
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
Dies funktioniert auf Geräten mit API-Level 23+, jedoch nicht auf Geräten mit einer niedrigeren Android-Version.
AppCompat
Hier kommt AppCompat ins Spiel. Die Spinner-Implementierung unterstützt ebenfalls popupTheme
, aber es ist etwas komplizierter, das Richtige zu tun .
<Spinner
android:layout_height="wrap_content"
android:layout_width="match_parent"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
Danach müssen Sie Ihren Adapter aktualisieren, um mit AppCompat arbeiten zu können. Sie tun dies, indem Sie die neue ThemedSpinnerAdapter
Schnittstelle implementieren .
public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
Theme getDropDownViewTheme() { ... }
void setDropDownViewTheme(Theme theme) { ... }
}
Diese Methoden werden von Spinner verwendet, um dem Adapter mitzuteilen, welches Thema zum Aufblasen von Dropdown-Ansichten verwendet werden soll. Um dies so einfach wie möglich zu gestalten, haben wir Ihnen eine Helper
Klasse gegeben, die Sie an Ihren Adapter anschließen können.
Dies bedeutet, dass Ihr Adapter so etwas wie:
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();
}
}
Für den Spinnerpfeil, den ich verwendet habe, android:backgroundTint="@color/white"
funktioniert dies ab API 21
für Spinneransicht und Dropdown-Ansicht:
ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);
areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);
Für getView () verwendet der Adapter spinner_item.xml
Für getDropDownView () verwendet der Adapter dropdwon_item.xml
Dann können Sie Ihre benutzerdefinierten Layouts nach Belieben verwenden
ich hoffe es hilft
Nur als Referenz, wenn Sie die verwenden CursorAdapter
, kann Ihre Implementierung viel einfacher sein, einfach überschreiben newView()
, keine Notwendigkeit, getDropDownView()
dort zu überschreiben :
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}
Sie können dies versuchen: Erstellen Sie in Ihrem Layout-Ordner eine 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" />
Verwenden Sie dann diesen Code:
spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);