Anpassen des Abstands der Spinner

7

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%     
Laurent 22.11.2014, 12:12
quelle

1 Antwort

30

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 :

%Vor%

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:

%Vor%

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 :

an %Vor%

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:

%Vor%     
Vikram 28.11.2014, 00:53
quelle