L’imbottitura interna di Spinner è più grande su Android 6.0.1

Intro:

Con la nuova versione di Android 6.0.1, sembra che Android abbia apportato alcune modifiche al componente Spinner perché, per impostazione predefinita, il riempimento interno attorno alla carota in basso è un po ‘più grande.

Ho notato questo in un’app in cui non ho modificato nulla nel codice, ma ho semplicemente aggiornato il sistema operativo sul dispositivo e tuttavia i pennini hanno dimensioni diverse.

Situazione:

Ho 2 filatori l’uno accanto all’altro in un RelativeLayout (attenzione al resto dei componenti, ho aggiunto tutto in modo da poter vedere questa parte del layout – rimosso le proprietà totalmente inutili o visualizzare gli ID)

            

Il layout utilizzato dall’adattatore Spinner per il metodo getView() è questo:

     

esemplificato:

Lo screenshot è combinato con 2 schermate separate prese:

  1. Quello in alto è occupato da un dispositivo Nexus 5 su Android 6.0
  2. Quello sotto è anche preso su un dispositivo Nexus 5 MA in esecuzione su Android 6.0.1

immagine dello schermo

  • MODIFICA 1

L’utilizzo di AppCompatSpinner dalla libreria di supporto non modifica il comportamento. La versione della libreria di supporto utilizzata è 23.1.1

Solutions Collecting From Web of "L’imbottitura interna di Spinner è più grande su Android 6.0.1"

Con il minimo sforzo sono stato in grado di risolvere questo problema costruendo uno sfondo personalizzato per lo spinner.

Usando AppCompatSpinner ho dovuto creare 2 xml per lo sfondo, chiamiamolo spinner_background.xml :

1. Il primo va nella cartella drawable e assomiglia a questo, spinner_background.xml :

 < ?xml version="1.0" encoding="utf-8"?>     

Dove selector_background_borderless è un semplice selettore come (ho aggiunto gli elementi minimi di cui hai bisogno, potresti esplorare la sua alternativa a ondulazione per la v21 +. In effetti ti consiglierei di farlo):

 < ?xml version="1.0" encoding="utf-8"?>     

E bg_spinner_anchor è un PNG a 9 patch per il cursore. Ho usato queste risorse: bg_spinner_anchor

2. Il secondo va alla cartella drawable-v23 per supportare correttamente ripple e assomiglia a questo, spinner_background.xml :

 < ?xml version="1.0" encoding="utf-8"?>     

Dove ic_spinner_caret è un vettore utilizzato dal codice sorgente Android simile a questo. Dovresti aggiungere anche questo nella tua cartella drawable-v23 :

 < ?xml version="1.0" encoding="utf-8"?>    

I crediti vanno ad alanv dal toolkit di interfaccia utente Android per Guidance!

Ho avuto lo stesso problema e il mio piano era il rollback dell’aggiornamento 6.0.1 solo per v23.

===

  1. Assicurati che il tuo Spinner abbia uno stile ad esso associato. Ad esempio lo stile denominato Widget.Spinner nell’esempio seguente:
  
  1. Crea (se già non esiste) styles.xml nella styles.xml values-v23 (per le modifiche verranno applicate solo all’API v23). Ad esempio, vedi esempio di definizione dello stile Widget.Spinner seguito:
 < ?xml version="1.0" encoding="utf-8"?>    

Il genitore dello stile è Widget.AppCompat.Spinner e ridefinisce il suo android:background con quello che torneremo dalla sorgente 6.0.1.

Nota che se hai come target anche altre versioni, dovrai aggiungere un file styles.xml predefinito nella directory dei values con la voce

  

perché è più semplice definire un altro stile generico piuttosto che file xml di layout diversi e il tuo progetto dovrebbe avere comunque uno styles.xml generico nella directory dei values , giusto? 🙂

  1. spinner_background_material.xml da https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/ . Salvalo nuovamente sotto drawable-v23 , ci assicureremo solo di cambiare API v23.

Il contenuto predefinito del file è:

     

Questo è il file che potresti voler modificare. Ho apportato modifiche a questo file per modificare la posizione del cursore:
a) set android:paddingEnd layer-list dei android:paddingEnd uguale a 0dp
b) dimezzato android:width del primo object android:width a 24 24dp
c) rimosso l'attributo android:end del secondo elemento

Le modifiche hanno reso lo sfondo più sottile, spogliandone i lati ma l'approccio ha mantenuto gli effetti a catena. Sentiti libero di giocare con i tuoi valori personalizzati, se necessario.

  1. Le modifiche precedenti non verranno compilate poiché saranno necessari più file per essere reffered dai file sopra.

Scarica in drawable-v23 (vedi link sopra):
a) control_background_40dp_material.xml
b) ic_spinner_caret.xml

Scarica in color-v23 :
a) control_highlight_material.xml da https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/ (questo file può probabilmente risiedere sotto drawable-v23 anche, ma lascia seguire il modello dei luoghi di origine originali per ora). Nota: il file @dimen/highlight_alpha_material_colored viene prelevato da appcompat-v7 , se ne usi uno 🙂 In caso contrario, puoi refferne il valore da esso:

 0.26 

===

La soluzione non è la migliore in quanto è necessario trasferire i file che non si possiedono originariamente. Inoltre, è ansible monitorare i possibili aggiornamenti di v23 per eventuali modifiche future. Ma almeno le modifiche sono contenute solo in v23.