android android-layout android-spinner android-6.0-marshmallow android-6.0.1-marshmallow

El relleno interno del hilandero es más grande en Android 6.0.1



android-layout android-spinner (2)

Introducción:

Con la nueva versión de Android 6.0.1, parece que Android realizó algunos cambios en el componente Spinner porque, de forma predeterminada, el relleno interno de la zanahoria hacia abajo es un poco más grande.

Noté esto en una aplicación donde no modifiqué nada en el código, sino que simplemente actualicé el sistema operativo en el dispositivo y, sin embargo, los giradores tienen diferentes tamaños.

Situación:

Tengo 2 giradores uno al lado del otro en un RelativeLayout (tenga en cuenta el resto de los componentes, agregué todo para que pueda ver esta parte del diseño; eliminé las propiedades totalmente innecesarias o los ID de vista)

<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>

El diseño utilizado por el adaptador Spinner para el método getView() es el siguiente:

<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>

Ejemplificado:

La captura de pantalla se combina con 2 capturas de pantalla separadas tomadas:

  1. El que está en la parte superior se toma en un dispositivo Nexus 5 que se ejecuta en Android 6.0
  2. La siguiente también se toma en un dispositivo Nexus 5 PERO que se ejecuta en Android 6.0.1

  • EDITAR 1

El uso de AppCompatSpinner de la biblioteca de soporte no cambia el comportamiento. La versión de la biblioteca de soporte utilizada es 23.1.1


Con un mínimo esfuerzo, pude arreglar esto al crear un fondo personalizado para el hilandero.

Usando AppCompatSpinner tuve que crear 2 xmls para el fondo, llamémoslo spinner_background.xml :

1. Primero, uno va a la carpeta spinner_background.xml y se ve así, 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>

Donde selector_background_borderless es un selector liso como (agregué los elementos mínimos que necesitas, podrías explorar su alternativa alternativa para v21 +. De hecho, te recomendaría que lo hicieras):

<?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>

Y bg_spinner_anchor es un PNG de 9 parches para el caret. Utilicé estos activos: bg_spinner_anchor

2. El segundo va a la carpeta drawable-v23 para admitir correctamente la ondulación y se parece a esto, 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>

Donde ic_spinner_caret es un vector usado desde el código fuente de Android que se ve así. Debe agregar también agregar esto a su carpeta drawable-v23 :

<?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>

¡Los créditos van a alanv desde el kit de herramientas de la interfaz de usuario de Android para Guidance!


Tuve el mismo problema y mi plan era deshacer la actualización 6.0.1 solo para v23.

  1. Asegúrate de que tu Spinner tenga un estilo adjunto. Por ejemplo, el estilo llamado Widget.Spinner en el siguiente ejemplo:

<Spinner android:id="@+id/spinner_1" style="@style/Widget.Spinner" android:layout_width="64dp" android:layout_height="64dp"/>

  1. Cree (si ya no existe) styles.xml en el directorio values-v23 (para los cambios se aplicarán solo a API v23). Por ejemplo, vea el ejemplo de definición de estilo de Widget.Spinner continuación:

<?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>

El padre del estilo es Widget.AppCompat.Spinner y redefine su android:background con el que vamos a retroceder desde la fuente 6.0.1.

Tenga en cuenta que si también está apuntando a otras versiones, deberá agregar un styles.xml predeterminado en el directorio de values con entrada

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

ya que es más fácil definir otro estilo genérico en lugar de diferentes archivos xml de diseño y su proyecto debería tener un styles.xml genérico debajo del directorio de values , ¿no? :)

  1. spinner_background_material.xml desde https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/ . drawable-v23 de nuevo en drawable-v23 , nos aseguraremos de que solo cambiemos API v23.

El contenido predeterminado del archivo es:

<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>

Ahora, este es el archivo que desea modificar. Hice cambios en este archivo para ajustar la posición de intercalación:
a) establece layer-list android:paddingEnd igual a 0dp
b) android:width la mitad del primer artículo android:width a 24dp
c) eliminó el atributo android:end del segundo elemento

Los cambios hicieron que el fondo se volviera más delgado, eliminando los lados pero el enfoque conservó los efectos de la onda. Siéntase libre de jugar con sus propios valores personalizados, si es necesario.

  1. Los cambios anteriores no se compilarán, ya que se necesitan más archivos para incluirlos, ya que los archivos mencionados anteriormente los remitirán.

Descarga en drawable-v23 (ver enlace arriba):
a) control_background_40dp_material.xml
b) ic_spinner_caret.xml

Descargar en color-v23 :
a) control_highlight_material.xml de https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/ (este archivo probablemente puede residir bajo drawable-v23 también, pero sigamos el patrón de las ubicaciones de origen originales por ahora). Tenga en cuenta que el archivo @dimen/highlight_alpha_material_colored se toma de appcompat-v7 , si usa uno :) De lo contrario, puede referirse a su valor:

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

La solución no es la mejor, ya que necesita traer archivos que no posee originalmente. Además, es posible que desee supervisar las posibles actualizaciones de v23 para cualquier cambio futuro. Pero al menos los cambios están contenidos en v23 solamente.