17

Intro:Spinner Innenpolster größer auf Android 6.0.1

Mit der neuen Version von Android 6.0.1, wie Android scheint machte einige Änderungen auf der Spinner-Komponente, da standardmäßig die innere Polsterung um die Karotte ist ein bisschen größer.

Ich bemerkte dies auf einer App, wo ich nichts im Code geändert habe, aber einfach das Betriebssystem auf dem Gerät aktualisiert und doch die Spinner haben unterschiedliche Größen.

Situation:

Ich habe 2 Spinnern eins neben dem anderen in einem RelativeLayout (der Rest der Komponenten ausmacht, habe ich alles hinzugefügt, so dass Sie diesen Teil des Layouts sehen können - entfernt die völlig unnötig Eigenschaften oder Ansicht ids)

<RelativeLayout 
    android:id="@+id/header" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/container_for_buttons_on_the_right" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true"> 

     <!-- Buttons here--> 
    </LinearLayout> 

    <android.support.v7.widget.AppCompatSpinner 
     android:id="@+id/spinner_1" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <ViewSwitcher 
     android:id="@+id/spinner_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_toEndOf="@id/spinner_1" 
     android:layout_toLeftOf="@id/container_for_buttons_on_the_right" 
     android:layout_toRightOf="@id/spinner_1" 
     android:layout_toStartOf="@id/container_for_buttons_on_the_right" 
     android:inAnimation="@anim/fade_in" 
     android:outAnimation="@anim/fade_out"> 

     <android.support.v7.widget.AppCompatSpinner 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" /> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <!-- ImageView properties are incomplete but I need it there.--> 
    </ViewSwitcher> 
</RelativeLayout> 

Das Layout durch den Spinner-Adapter für das getView() verwendete Verfahren ist folgende:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:orientation="horizontal" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:ellipsize="end" 
     android:gravity="center_vertical" 
     android:singleLine="true" 
     tools:text="Test" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="0" 
     android:gravity="center" 
     android:paddingLeft="4dp" 
     android:singleLine="true" 
     android:textColor="@color/text_primary" 
     android:textSize="@dimen/text_size_body" 
     tools:ignore="RtlHardcoded,RtlSymmetry" 
     tools:text="7%" /> 
</LinearLayout> 

am Beispiel:

Der Screenshot ist, genommen aus 2 separaten Screenshots kombiniert:

  1. Die auf der Oberseite auf einem Nexus 5 Gerät genommen wird auf Android 6.0
  2. Den Laufe eine unten ist auch auf einem Nexus 5 Gerät ABER auf Android 6.0.1

screenshot

  • EDIT 1

AppCompatSpinner von der Support-Bibliothek verwenden das Verhalten nicht ändern. Unterstützte Bibliothek Version ist 23.1.1

+0

Wir mussten mehr Padding um den Down Caret hinzufügen, um einen Bug zu vermeiden, wenn der Ripple-Effekt angezeigt wird. Wenn Sie eine konstante Größe benötigen, kopieren Sie den Hintergrund aus dem Framework und verwenden Sie dieses oder verwenden Sie AppCompat. – alanv

+0

Ich verwende AppCompat :). Können Sie mir sagen, wie genau diese Polsterung ist? Scheint mir, als wäre es um 8 oder 10? – Mike

+0

Es ist 12dp End Padding und eine konstante 48dp End-ausgerichtete Lücke, die effektiv 12dp von Startpolsterung ist. Sie können direkt im Android SDK-Verzeichnis unter 'platforms/android-23/data/res/drawable/spinner_background_material.xml' nachsehen. – alanv

Antwort

7

Mit minimalem Aufwand konnte ich dies beheben, indem Sie einen benutzerdefinierten Hintergrund für den Spinner erstellen.

Mit AppCompatSpinner Ich hatte 2 xmls für den Hintergrund zu erstellen, nennen wir diese spinner_background.xml:

1. Erste einen zum drawable Ordner geht und sieht wie folgt aus, spinner_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:opacity="transparent"> 
    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/selector_background_borderless" 
     android:gravity="end|center_vertical" /> 
    <item android:drawable="@drawable/bg_spinner_anchor" /> 
</layer-list> 

Wo selector_background_borderless ist ein einfacher Selektor wie (Ich fügte die minimalen Elemente, die Sie benötigen, können Sie erkunden, es ist Ripple Alternative für v21 +.In der Tat würde ich Ihnen empfehlen, dies zu tun):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="#19000000" android:state_pressed="true" /> 
    <item android:drawable="@android:color/transparent" /> 
</selector> 

Und bg_spinner_anchor ein 9patch PNG für das Caret ist. Ich verwendet, um diese Vermögenswerte: bg_spinner_anchor

2. Die zweite geht an den drawable-v23 Ordner richtig Welligkeit zu unterstützen und sieht wie folgt aus, spinner_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:paddingEnd="16dp" 
    android:paddingLeft="0dp" 
    android:paddingMode="stack" 
    android:paddingRight="0dp" 
    android:paddingStart="0dp"> 
    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/selector_background_borderless" 
     android:gravity="end|center_vertical" /> 

    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/ic_spinner_caret" 
     android:gravity="end|center_vertical" /> 
</layer-list> 

Wo ic_spinner_caret ein Vektor aus dem Android-Quelle verwendet wird Code sieht so aus. Sie sollten auch hinzufügen, diese zu Ihrem drawable-v23 Ordner hinzufügen: für Streckenführung alanv aus dem Android UI-Toolkit

<?xml version="1.0" encoding="utf-8"?> 
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0" 
    android:tint="?attr/colorControlNormal"> 
    <path 
     android:pathData="M7,10l5,5,5-5z" 
     android:fillColor="#524e4a"/> 
</vector> 

Credits gehen!

+1

Der Link für 'bg_spinner_assets' verweist auf die' Backstreet_Boys' mp3 Datei. Können Sie sich das bitte anschauen? Danke –

+0

Lass mich wissen, ob mein GitHub-Link funktioniert. – Mike

+0

Der Link funktioniert jetzt. Vielen Dank. –

3

Ich hatte das gleiche Problem und mein Plan war Rollback das Update 6.0.1 nur für v23.

===

  1. Achten Sie darauf, Ihre Spinner einen Stil mit ihm verbunden hat. Zum Beispiel Stil wie Widget.Spinner in Beispiel genannt unten:
<Spinner 
    android:id="@+id/spinner_1" 
    style="@style/Widget.Spinner" 
    android:layout_width="64dp" 
    android:layout_height="64dp"/> 
  1. erstellen (falls nicht bereits vorhanden ist) styles.xml unter values-v23 Verzeichnis (Änderungen werden nur auf API v23 angewandt werden). Siehe zum Beispiel Widget.Spinner Stildefinition Beispiel unten:
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"> 
     <item name="android:background">@drawable/spinner_background_material</item> 
    </style> 
</resources> 

Die Eltern Stil ist Widget.AppCompat.Spinner und es neu definiert, es ist android:background mit dem einen werden wir Rollback von 6.0.1 Quelle sein.

Beachten Sie, dass, wenn Sie andere Versionen auch Targeting sind, müssen Sie styles.xml unter values Verzeichnis mit dem Eintrag

<style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"/> 

einen Standard hinzufügen es einfacher ist, einen anderen generischen Stil, anstatt verschiedene Layout-XML zu definieren, Dateien und Ihr Projekt sollte eine generische styles.xml unter values Verzeichnis sowieso haben, oder? :)

  1. Holen Sie spinner_background_material.xml von https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/. Speichern Sie es unter drawable-v23 für erneut, wir werden nur sicherstellen, dass wir nur API v23 ändern.

Datei des Standardinhalt ist:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
     android:paddingMode="stack" 
     android:paddingStart="0dp" 
     android:paddingEnd="48dp" 
     android:paddingLeft="0dp" 
     android:paddingRight="0dp"> 
<item 
    android:gravity="end|fill_vertical" 
    android:width="48dp" 
    android:drawable="@drawable/control_background_40dp_material" /> 
<item 
    android:drawable="@drawable/ic_spinner_caret" 
    android:gravity="end|center_vertical" 
    android:width="24dp" 
    android:height="24dp" 
    android:end="12dp" /> 
</layer-list> 

Nun, dies ist die Datei, die Sie zwicken möchten.Ich habe Änderungen an dieser Datei für das Caret Position Zwicken:
a) gesetzt layer-list ‚s android:paddingEnd gleich 0dp
b) ersten Elements android:width zu 24dp
c halbiert) entfernt, um die android:end zweite Element Attribut

The Änderungen machten den Hintergrund dünner, indem sie die Seiten abstreifen, aber der Ansatz behielt die Welleneffekte bei. Fühlen Sie sich frei, bei Bedarf mit Ihren eigenen benutzerdefinierten Werten herumzuspielen.

  1. Die oben beschriebenen Änderungen werden nicht kompiliert, da mehr Dateien benötigt werden, weil sie von den obigen Dateien angesprochen werden.

Herunterladen in drawable-v23 (siehe Link oben):
a) control_background_40dp_material.xml
b) ic_spinner_caret.xml

Herunterladen in color-v23:
a) control_highlight_material.xml von https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/ (diese Datei wahrscheinlich unter drawable-v23 wohnen kann auch, aber lassen Sie das Muster der ursprünglichen Quellorte für jetzt folgen). Beachten Sie, dass die Datei @dimen/highlight_alpha_material_colored wird aufgenommen von appcompat-v7, wenn Sie einen verwenden :) Wenn nicht, können Sie reffer es Wert ist von ihm:

<item format="float" name="highlight_alpha_material_colored" type="dimen">0.26</item> 

===

Die Lösung ist nicht die beste, wie Sie ist Dateien, die Sie nicht besitzen, müssen Sie mitbringen. Möglicherweise möchten Sie auch die möglichen Updates für v23 für zukünftige Änderungen überwachen. Aber zumindest sind die Änderungen nur in v23 enthalten.

+0

Danke für die ausführliche Antwort. Funktioniert! –

+0

Danke für das Posten dieses Svennu. Du hast mir eine Menge Zeit mit der hilfreichen Erklärung erspart! – JPM

+0

Auf den zweiten Gedanken. Dies funktioniert nicht gut auf API 24, wenn versucht wird, den Caret zu verbergen. – JPM