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:
- El que está en la parte superior se toma en un dispositivo Nexus 5 que se ejecuta en Android 6.0
- 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.
- Asegúrate de que tu
Spinner
tenga un estilo adjunto. Por ejemplo, el estilo llamadoWidget.Spinner
en el siguiente ejemplo:
<Spinner
android:id="@+id/spinner_1"
style="@style/Widget.Spinner"
android:layout_width="64dp"
android:layout_height="64dp"/>
- Cree (si ya no existe)
styles.xml
en el directoriovalues-v23
(para los cambios se aplicarán solo a API v23). Por ejemplo, vea el ejemplo de definición de estilo deWidget.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? :)
-
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 endrawable-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.
- 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.