Auf Lollipop sehen Spinner und Dropdown gut aus, obwohl die Dropdown-Hintergrundfarbe schwarz ist, verglichen mit dem Menü-Dropdown, das weiß ist. Ich vermute, dass app:popupTheme="@style/ThemeOverlay.AppCompat.Light" wird nicht an den Spinner weitergegeben.
Android 5.0
Das große Problem besteht nun bei Android 4.x, bei dem die Dropdown-Hintergrundfarbe weiß ist (Popup-Design verbreitet?) Und das Symbol neben dem Spinner schwarz ist.
Android 4.4
Wie kann ich es im XML richtig einstellen oder im Code implementieren, damit es sowohl auf Android 5 als auch auf 4 funktioniert? Idealerweise hätte ich gerne beide Looks wie auf Android 5, aber mit weißem Spinner-Dropdown (wie Drop-down-Menü für Einstellungen).
Aktualisieren
Ich habe diese Einstellungseigenschaft bemerkt colorControlNormal wirkt sich auf das Filtersymbol des Spinners aus. Wenn jemand herausfindet, wie man das für Spinner nutzt (ohne andere Inhaltssteuerelemente zu ändern), dann hätte ich meine Lösung, indem ich diese Erkenntnis mit @Sven antworte.
Aktualisieren
Die folgende Änderung behebt das Problem mit Spinner-Text und Popup-Farbe. Das einzige Problem für die endgültige Lösung ist also das Filtersymbol.
Ich habe festgestellt, dass das Filtersymbol tatsächlich ein Teil von ist android:background für den Spinner angegeben und transparent. Das Bereitstellen eines eigenen Hintergrunds würde das Problem beheben, z
Das letzte Puzzleteil ist das Popup auf Android 5 mit schwarzem Hintergrund und weißem Text, aber ich denke, es kann mit einem benutzerdefinierten Layout gelöst werden. Wenn niemand eine vollständige Antwort liefert, werde ich es selbst tun und als akzeptiert markieren.
versuchen zu benutzen getSupportActionBar().getThemedContext() stattdessen mToolbar.getContext()
– Selvin
5. November 2014 um 11:20 Uhr
@Selvin Das habe ich schon probiert. Es sieht genau gleich aus
– Damian Petla
5. November 2014 um 11:22 Uhr
@Loop Ich habe das gleiche Problem, hast du jemals eine Lösung gefunden?
– Nathan Walters
13. November 2014 um 22:42 Uhr
Für das Spinner-Symbol kann dies hilfreich sein.
– Schildkröte
14. November 2014 um 9:17 Uhr
@Loop Ich hatte mit der gleichen Sache zu kämpfen und fand heraus, dass die Aktualisierung von AppCompat von 21.0.0 auf 21.0.2 die Farbe des Spinner-Filtersymbols korrigierte. Ich habe andere Probleme gelöst, indem ich benutzerdefinierte Layouts verwendet habe.
– Andrej Makarow
8. Dezember 2014 um 8:37 Uhr
Dan
Ich weiß, das ist spät, aber ich bin auf diese Frage gestoßen, als ich selbst auf dieses Problem gestoßen bin und eine Lösung in gefunden habe BrowseSessionsActivity des Google I/O 2014-App und angepasst.
Es ist noch nicht zu spät :). Ich möchte hinzufügen, dass toolbar_spinner.xml nicht notwendig ist. Sie können in einfügen. Auf diese Weise benötigen Sie kein Behälteraufblasen und zusätzliche Zugstangen. Spinner verwendet standardmäßig Drawable.
– bajicdusko
28. Februar 2015 um 13:51 Uhr
getLayoutInflater() scheint nicht erkannt zu werden, wie bekommt man einen LayoutIinflater in den BaseAdapter?
– Mendhak
1. März 2015 um 12:25 Uhr
Ich denke, das schlägt bei Gingerbread fehl mit: … Verursacht durch: android.content.res.Resources$NotFoundException: Ressource ist kein Drawable (Farbe oder Pfad): TypedValue{t=0x2/d=0x101030e a=2} und 0x101030e scheint zu sein developer.android.com/reference/android/… – Das Entfernen der Verwendung von ?android:selectableItemBackground in styles.xml führt jedoch zu einigen UI-Problemen.
– aleb
2. März 2015 um 19:43 Uhr
Das funktioniert nicht gut auf Lolipop. Der Hintergrund dort ist dunkel :/
– Jacek Kwiecień
5. März 2015 um 18:57 Uhr
@Xylian: Hinzufügen android:theme="@style/ThemeOverlay.AppCompat.Light" zu Ihrer Spinner-Komponente, die es für mich behoben hat. Ich habe die Antwort bearbeitet, die meine letzten beiden Kommentare widerspiegelt.
– Hubi
20. April 2015 um 7:07 Uhr
Implementieren Sie Spinner nicht in XML
final ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(getSupportActionBar().getThemedContext(),
R.array.main_navigation_list, R.layout.spinner_text);
spinnerAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
mNavigationTags = getResources().getStringArray(R.array.main_navigation_list);
mNavigationSpinner = new Spinner(getSupportActionBar().getThemedContext());
mNavigationSpinner.setAdapter(spinnerAdapter);
mNavigationSpinner.setOnItemSelectedListener(this);
mToolbar.addView(mNavigationSpinner);
Auf diese Weise wird das Symbol neben dem Spinner weiß
DAS ist der richtige Weg!
– Langusten Gustel
20. November 2015 um 8:09 Uhr
Miao1007
Tut mir leid für mein schlechtes Englisch. 🙂 Ich denke, es ist besser, den Spinner direkt in der Toolbar zu erstellen.
Hier ist ein Beispiel in meinem Fragment.
public class Testfragment1 extends Fragment {
Toolbar mToolbar;
Spinner mSpinner;
.....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
.......
mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
//you can also set the style with the constructor
mSpinner = new Spinner(getActivity());
String[] frags = new String[]{
"category1",
"category2",
"category3",
};
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,frags);
mSpinner.setAdapter(arrayAdapter);
mToolbar.addView(mSpinner);
return inflater.inflate(R.layout.fragment_testfragment1, container, false);
}
.........
@Override
public void onDestroyView() {
super.onDestroyView();
if (mToolbar != null && mSpinner != null) {
mToolbar.removeView(mSpinner);
}
}
}
Danke für deine Antwort, ich werde es versuchen. Ich glaube jedoch, dass die Verwendung interner Widget-Implementierungen keine gute Idee ist, da sie in appcompat ohne weitere Ankündigung geändert werden kann. Außerdem erwarte ich in der vollständigen Lösung, dass das Spinner-Popup wie das von Settins aussieht (weißer Hintergrund mit weißem Text).
– Damian Petla
9. November 2014 um 13:29 Uhr
Wie hast du das auf Android 4.1 kompiliert? Bei der Verwendung von ToolBar zwingt es mich, das minSDK auf 21 zu setzen und wird daher nicht auf etwas niedrigerem kompiliert
– Sauron
14. Dezember 2014 um 21:51 Uhr
TintSpinner ist ein internes Widget und wird sich ändern. Die Idee ist, interne Widgets als öffentliche freizugeben, daher wird die API mehrere Änderungen erfahren (zum Beispiel wird TintSpinner einfach Spinner genannt). Bitte vermeiden Sie die Verwendung dieser Methode um jeden Preis, es sei denn, Sie planen, bei Ihrer aktuellen AppCompat-Bibliotheksversion und all ihren Fehlern zu bleiben.
– mradsinski
10. Februar 2015 um 8:48 Uhr
Diese Klassen sind in appcompat v22.2 nicht vorhanden
– LOG_TAG
15. Juli 2015 um 7:29 Uhr
@LOG_TAG Es ist für die Navigationsschublade konzipiert, Sie werden den Spinner nicht sehen, wenn Sie ihn in ein anderes Fragment geändert haben.
– Miao1007
16. Juli 2015 um 7:52 Uhr
Ich kämpfe mit genau dem gleichen Problem.
Versuchen Sie, die Dropdown-Ansichtsressource zu ändern. Zumindest hat dies das Problem mit der Textfarbe für mich behoben – die Farbe des Pfeilsymbols ist jedoch immer noch dunkel. Dies ist also nur eine teilweise Problemumgehung.
Es ist nicht perfekt und die Elemente werden nicht hervorgehoben, wenn Sie darauf klicken, aber es ist gut genug, während wir darauf warten, dass die zukünftigen appcompat-Bibliotheken diese Probleme beheben (hier hoffen wir trotzdem).
Ich habe zwei Tage mit diesem Problem verbracht, aber jetzt, nachdem ich viele Antworten gelesen habe, kann ich meine Lösung posten. Ich habe zwei benutzerdefinierte Layouts für das Spinner-Element und das Popup implementiert. Festlegen dieses Attributs für Spinner: android:background="?android:selectableItemBackground" Der schwarze Pfeil des Standard-Spinners ist ausgeblendet und wir können verwenden, was wir bevorzugen. Ich habe die Methode setDropDownVerticalOffset(int) verwendet, um die Popup-Position in Android-Versionen vor Lollipop zu verwalten.
versuchen zu benutzen
getSupportActionBar().getThemedContext()
stattdessenmToolbar.getContext()
– Selvin
5. November 2014 um 11:20 Uhr
@Selvin Das habe ich schon probiert. Es sieht genau gleich aus
– Damian Petla
5. November 2014 um 11:22 Uhr
@Loop Ich habe das gleiche Problem, hast du jemals eine Lösung gefunden?
– Nathan Walters
13. November 2014 um 22:42 Uhr
Für das Spinner-Symbol kann dies hilfreich sein.
– Schildkröte
14. November 2014 um 9:17 Uhr
@Loop Ich hatte mit der gleichen Sache zu kämpfen und fand heraus, dass die Aktualisierung von AppCompat von 21.0.0 auf 21.0.2 die Farbe des Spinner-Filtersymbols korrigierte. Ich habe andere Probleme gelöst, indem ich benutzerdefinierte Layouts verwendet habe.
– Andrej Makarow
8. Dezember 2014 um 8:37 Uhr