7

Yaptığım bir uygulamada, yeni Android Lollipop'u çalıştıran cihazlarda ImageView'ların renklendirilmediğini fark ettim. Bu OS'nin eski sürümlerinde düzgün çalışması için kullanılan kod:Renklendirme ImageView, Android 5.0 üzerinde çalışmıyor. Fikirler nasıl tekrar çalışır?

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

ve bu ImageView yüklenir çizilebilir öğesidir: bu doğru üzerinde çalışıyor, bir kez daha

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

JellyBean/Kitkat çalışan cihazlar, ancak renk tonu Lollipop çalıştıran cihazlar üzerinde hiçbir etkisi yoktur. Bunun nasıl tamir edileceğine dair fikri olan? İşletim sistemindeki bir hata mı, yoksa görüntüyü farklı şekilde renklendirmeye mi başlamalıyım?

+2

. ImageView'ın renk tonu özniteliği Drawable.setColorFilter() yerine Drawable.setTint() kullanmak için güncelleştirildi, ancak GradientDrawable setTint() öğesini desteklemiyordu. XML'den bunun için gerçekten iyi bir geçici çözüm yoktur, ancak setColorFilter() kodunu koddan çağırabilirsiniz. – alanv

+0

Awesome, bunu zaten hallettiğinizi bilmek güzel! Cevap için teşekkürler :) –

cevap

8

@ alanv yorumuna göre, burada bu hatanın hacky düzeltmesi gider. Temel fikir, ImageView uzatmak ve sağ enflasyonu sonra ColorFilter uygulamaktır: tahmin edeceğiniz gibi bu örnek biraz sınırlıdır

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); 
     } 
    } 
} 

(enflasyon tonu sonra Drawable kümesi güncellenen olmayacak ColorStateList sadece varsayılan renk kullanılır, ve belki başka bir şey), ama fikriniz varsa, kullanım çantanıza sığdırabilirsiniz.

1

Kullanım şöyle AppCompatImageView:

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

Eğer son compile 'com.android.support:appcompat-v7:23.4.0' olduğundan emin olun uygulamanızın en build.gradle. Gelecekteki bir sürüm için düzeltilen OS hatası