7

In un'applicazione che ho creato ho notato che le ImageViews non sono colorate sui dispositivi che eseguono il nuovo Android Lollipop. Questo è il codice che consente di lavorare correttamente anche su versioni precedenti del sistema operativo:Tinting ImageView non funziona su Android 5.0. Idee come farlo funzionare di nuovo?

<ImageView 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_gravity="bottom|right" 
      android:contentDescription="@string/descr_background_image" 
      android:src="@drawable/circle_shape_white_color" 
      android:tint="@color/intent_circle_green_grey" /> 

e questa è la drawable che viene caricato nella ImageView:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
    <gradient android:startColor="@color/white" android:endColor="@color/white" 
     android:angle="270"/> 
</shape> 

Ancora una volta, questo funziona correttamente su dispositivi che eseguono JellyBean/Kitkat, ma la tinta non ha alcun effetto sui dispositivi che eseguono Lollipop. Qualche idea su come aggiustarlo? È un bug nel sistema operativo o dovrei iniziare a colorare l'immagine in modo diverso?

+2

Errore del sistema operativo che è stato corretto per una versione futura. L'attributo tinta di ImageView è stato aggiornato per utilizzare Drawable.setTint() piuttosto che Drawable.setColorFilter(), ma GradientDrawable non supporta setTint(). Non c'è davvero una buona soluzione per questo da XML, ma è possibile chiamare setColorFilter() dal codice. – alanv

+0

Fantastico, è bello sapere che te ne sei già occupato! Grazie per la risposta :) –

risposta

8

Come per il commento @alanv, ecco la correzione hacky a questo bug. L'idea di base è quella di estendere e applicare ImageViewColorFilter subito dopo l'inflazione:

public class TintImageView extends ImageView { 

    public TintImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     initView(); 
    } 

    private void initView() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      ColorStateList imageTintList = getImageTintList(); 
      if (imageTintList == null) { 
       return; 
      } 

      setColorFilter(imageTintList.getDefaultColor(), PorterDuff.Mode.SRC_IN); 
     } 
    } 
} 

Come si può immaginare, questo esempio è piuttosto limitato (Drawable set dopo tinta inflazione non sarà aggiornato, viene utilizzato solo colore predefinito di ColorStateList, e forse qualcos'altro), ma se hai l'idea puoi adattarla al tuo caso d'uso.

1

Utilizzare il AppCompatImageView in questo modo:

<android.support.v7.widget.AppCompatImageView 
     android:id="@+id/my_appcompat_imageview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/my_image" 
     android:tint="#636363" 
    /> 

Assicurarsi di avere l'ultima compile 'com.android.support:appcompat-v7:23.4.0' in di build.gradle vostra applicazione.

Problemi correlati