Spinner bieten zwei Zustände. Der erste und der Standardzustand ( state A ) zeigen den aktuell ausgewählten Wert an. Der zweite ( state B ) zeigt ein Dropdown-Menü, wenn die Spinner-Anzeige berührt wird.
Standardmäßig wird ein linker Padding zu den Elementen hinzugefügt, die im Status A und B angezeigt werden. Ich möchte sie entfernen, wenn der aktuell ausgewählte Wert angezeigt wird ( Status A ), aber bei Elementen beibehalten werden im Dropdown-Menü angezeigt ( state B ).
Da die Auffüllung mit der CheckedTextView im Layout festgelegt wird, das beim Erstellen des Spinner angegeben wurde, bestand mein erster Versuch darin, ein benutzerdefiniertes Layout mit einem CheckedTextView mit leerem Inhalt an den Spinner-Konstruktor zu übergeben Polsterung. Auf diese Weise verschwindet die linke Füllung im Zustand A, aber auch im Zustand B. Mein Ziel war es jedoch, den Zustand A zu erhalten.
Mein zweiter Versuch war, android: dropDownSpinnerStyle in meiner Theme-Definition anzupassen. Da die Hintergrundfarbe für android: dropDownSpinnerStyle die Hintergrundfarbe des Elements nur in Zustand A ändert, dachte ich, dass marginLeft oder paddingLeft mit einem negativen Wert überschrieben werden sollten. Leider hat es keinen Effekt.
Da die negative Marge / Polsterung anscheinend nicht berücksichtigt wird, habe ich das Gegenteil versucht. Erstens habe ich ein benutzerdefiniertes Layout verwendet (wie bei meinem ersten Versuch erklärt), um die linke Auffüllung beider Zustände (A und B) zu entfernen. Zweitens habe ich einen benutzerdefinierten Stil für die Eigenschaft android: dropDownListViewStyle definiert. Leider hat die Verwendung eines positiven marginLeft-Werts mit der letzten Eigenschaft keine Auswirkung. Also habe ich paddingLeft gesetzt. Es funktioniert und erlaubt mir, den linken Abstand nur für Zustand B zu erhalten. Der linke Raum gilt jedoch auch für die Hintergrund-Touch-Farbe (siehe Bild unten).
Ich denke, dass nur der Stil für Zustand A geändert werden sollte, wenn ich die Hintergrundfarbe auf dem Touch haben möchte, die die Dropdown-Menü-Breite vollständig ausfüllt. Jede Idee, Vorschlag oder Beispiel ist willkommen.
Unten ist meine Theme-Definition für den dritten Versuch:
%Vor%State A nimmt den folgenden Stil an:
%Vor% Das Attribut hier ist spinnerItemStyle
.
Darüber hinaus ist das Padding nicht paddingLeft
, aber paddingStart
- um LTR & amp; RTL-Sprachen. In ähnlicher Weise wird paddingEnd
anstelle von paddingRight
festgelegt. Diese Information gilt für API & gt; = 17.
Wenn Sie AppCompat verwenden, überschreiben Sie weiterhin das Attribut spinnerItemStyle
, stellen jedoch paddingLeft
und paddingRight
bereit.
Beispiel:
%Vor% Der Wert 40dp
dient zum Testen, wenn die Einstellung dieses Stils auch funktioniert. Dies sollte nur State A
(mit 40dp) auffüllen, wobei State B
mit dem Standard-Padding von 8dp
belassen wird. Sobald bestätigt, können Sie es 0dp
oder gemäß Ihrer Anforderung machen.
Das ist das Ergebnis, das ich bekomme:
Aktualisierung:
In Bezug auf das Beispielprojekt - MainActivity
:
Wenn Sie dem Adapter android.R.layout.simple_spinner_item
geben, sagen Sie ihm, dass er das Layout für beide State A und State B verwenden soll. Dies ist ein Problem, da dieses Layout definiert ist:
Beachten Sie, dass style
auf diese TextView
angewendet wurde. Zuvor hatte ich vorgeschlagen, dieses Attribut zu überschreiben. Und es hat funktioniert. Aber da dieses Layout für beide Zustände verwendet wird, ist das Ergebnis nicht wie gewünscht.
Tatsächlich ist die obige Aussage (obwohl sie im Moment nichts tut) vielversprechender:
%Vor% Wenn Sie setDropDownViewResource(int)
verwenden, können Sie verschiedene Stilattribute einfügen. In diesem Fall wird der Status A durch android.R.layout.simple_spinner_item
und der Status B durch android.R.layout.simple_spinner_dropdown_item
dargestellt.
Schauen wir uns android.R.layout.simple_spinner_dropdown_item
:
Jetzt können wir ein anderes Attribut überschreiben - spinnerDropDownItemStyle
- und geben State B ein ganz anderes Aussehen. Aber wir werden nicht. Auf Lollipop zeigt spinnerDropDownItemStyle
auf den Style Widget.Material.DropDownItem.Spinner
, wodurch der paddingX
auf 8dp
gesetzt wird. Und Sie sagten, dass Sie mit dem Standard-Padding in State B einverstanden sind.
Also, hier ist was du brauchst:
%Vor%UND, falls Sie dies noch nicht haben, fügen Sie es zu values / styles.xml:
hinzu %Vor% Sie sollten auch values-v21/styles.xml
erstellen und hinzufügen:
Tags und Links android android-layout appcompat drop-down-menu android-spinner