Android getResources (). GetDrawable () kullanımdan kaldırılmış API 22


700

Yeni android API 22 getResources().getDrawable()ile artık kullanımdan kaldırıldı. Şimdi en iyi yaklaşım sadece kullanmaktır getDrawable().

Ne değişti?


Sorunuzu belirtir misiniz? getDrawable (int id)Sınıf yönteminin Resourceskullanımdan kaldırılması doğrudur . Şimdi yöntemi getDrawable (int id, Resources.Theme theme)yeni theme parametresiyle kullanmalısınız.
kod maymun

1
ContextCompat.getDrawable (içerik, R.color.color_name)
Ashokchakravarthi Nagarajan

Dışarı kontrol edebilirsiniz benim blog yazısı hem neden daha kapsamlı bir açıklama için bu konuda Resources#getDrawable(int)ve Resources#getColor(int)kullanımdan kaldırıldı bulundu.
Alex Lockwood

1
Google, kullanımdan kaldırılan her işlev için hızlı düzeltmeler yapmalıdır. Burada bu konuda bir yazı yaptım: code.google.com/p/android/issues/detail?id=219495
android geliştirici

Yanıtlar:


1028

Hangi tür çekilebilir kağıt yüklediğinize bağlı olarak, bu kullanımdan kaldırmayı doğru (ve gelecekteki kanıt ) şekilde işlemek için bazı seçenekleriniz vardır:


A) tema özelliklerine sahip çekmeceler

ContextCompat.getDrawable(getActivity(), R.drawable.name);

Etkinlik temanızın talimat verdiği gibi stil sahibi bir Çizilebilir elde edersiniz. Muhtemelen ihtiyacınız olan şey budur.


B) tema özelliği olmayan çekmeceler

ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Eski tarzda çizilmemiş çekmeceni alacaksın. Not: Lütfen ResourcesCompat.getDrawable()edilir değil kaldırılan!


EXTRA) başka bir temanın tema özelliklerine sahip çekilebilirler

ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);

Uygulamam B önerisini kullanarak kilitleniyor. Çağrıyı beğenmiyor Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null);
FraktalBob

Bunu şu şekilde beyan ederim: genel statik void setImageButtonEnabled (Bağlam ctxt, boolean etkin, ImageButton öğesi, int iconResId) {item.setEnabled (etkin); Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null); Çekilebilir simge = etkin mi? originalIcon: convertDrawableToGrayScale (originalIcon); item.setImageDrawable (simge); } ve şu şekilde çağırın: Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
FractalBob

Daha doğrusu, ikonum bir Vektör çekilebilir olduğu için kaza oluyor gibi görünüyor.
FractalBob

1
xamarin sürümü: ResourcesCompat.GetDrawable (Kaynaklar, Resource.Drawable.name, null);
Brian

Sana bir kelime daha ekliyorum , ContextCompat.getColor (bağlam, renk) da sana yardımcı olabilir ...
BertKing

746

Düzenle: daha eksiksiz bir açıklama için konu hakkındaki blog yayınımı görün


Bunun yerine destek kitaplığından aşağıdaki kodu kullanmalısınız:

ContextCompat.getDrawable(context, R.drawable.***)

Bu yöntemi kullanmak çağırmaya eşdeğerdir:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

API 21'den itibaren, belirtilen ekran yoğunluğu / teması için belirli bir kaynak kimliğiyle ilişkili çizilebilir bir nesne getirmenize izin verdiği için getDrawable(int, Theme)yerine yöntemi kullanmalısınız getDrawable(int). Kullanımdan kaldırılan getDrawable(int)yöntemin çağrılması çağrıyla eşdeğerdir getDrawable(int, null).


8
Bence OP aynı zamanda sınıfın getDrawable (int id)yöntemini de ifade ediyor Context. Bu, getResources().getDrawable(id, getTheme());yeni API ile aynıdır ve aynı zamanda kullanır.
kod maymun

9
Belgelere göre, min. API seviye 21'in kullanılması gerekmektedir getDrawable(int, Resources.Theme).
Prens

@Prince Yöntem API 21'de eklendi, ancak API 22'ye kadar kullanımdan kaldırılmadı. :)
Alex Lockwood

Android doc ayrıca Context :: getDrawable (int) yönteminin kullanılmasını önerir, ancak yalnızca API 21'de tanıtıldığından ContextCompat'ın en iyi seçim olduğu görülmektedir.
goRGon

Bu yanıt, API 21'den daha eski sürümlerde .svg dosyalarıyla çalışmaz. Kütüphanede bir hata var.
Jorge Rodríguez

141

Bu satırı değiştirin: getResources().getDrawable(R.drawable.your_drawable)

ile ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

DÜZENLE

ResourcesCompatşimdi de kullanımdan kaldırıldı. Ancak bunu kullanabilirsiniz:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(İşte thisbağlam)

daha fazla bilgi için bu bağlantıyı takip edin: ContextCompat


2
Bu da şimdi
sınırlandırılmış


2
O içinde söylemez bağlantıResourcesCompat kaldırılmıştır. İyi çalışmalı.
Jacob R

çekilebilir depolanan liste öğelerini tıklayarak bir liste görünümüne görüntü girmek istiyorsanız "çizilebilir" yazmak ne
0x0001

29

getResources().getDrawable() API düzeyinde 22 kullanımdan kaldırıldı. Şimdi temayı eklemeliyiz:

getDrawable (int id, Resources.Theme teması) (API düzey 21'e eklendi)

Bu bir örnektir:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

Bu, sonraki sürümler için nasıl doğrulama yapılacağına bir örnektir:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

Build.VERSION_CODES.LOLLIPOP is API 21Böylece bu olmamalı if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)ya if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? Boşver. Aşağıdan "Yöntem API 21'e eklendi, ancak API 22'ye kadar kullanımdan kaldırılmadı. :)"
Mark Cramer

2

Kullanabilirsiniz

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

bu benim için iş


Lolipop öncesi vektör çekilebilir çökmeleri yüklemek için uygulama bağlamını kullanma. Bunun için herhangi bir düzeltme var mı?
muthuraj

1
@muthuraj Lolipop kılıfı ile kod testimi hatırlamıyorum, ancak bunun yerine getActivity () veya getResources () 'i deneyebilirsiniz, bu kodunuzla uyumlu mu?
Dasser Basyouni

MVVM desen kullanıyorum ve aktivite bağlamı olmayan ViewModels içinde çizilebilir şişirmek gerekir. Yalnızca uygulama bağlamı vardır. Benim sorunum bu.
muthuraj

1

ListView yüklemek için bir dizideki sorunu nasıl düzelttiğime sadece bir örnek, yardımcı olacağını umuyorum.

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

1

Bunu dene:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}

Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
Donald Duck


1

getDrawable (int drawable) , API düzey 22'de kullanımdan kaldırılmıştır. Referans için bu bağlantıya bakın .

Şimdi bu sorunu çözmek için aşağıdaki gibi id ile birlikte yeni bir yapıcı geçmek zorunda: -

getDrawable(int id, Resources.Theme theme)

Çözümler için Bunu yapın: -

Java dilinde: -

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

veya

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

Kotlin'de: -

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

veya

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

Umarım bu size yardımcı olacaktır.


GetDrawable (DrawableRes int id, Theme theme), kaynak bulunmazsa getDrawable (Context bağlam, int id) geçersiz olabilir, bu nedenle Drawable ile döndürülmelidir? Kotlin Şehrindeki oteller.
Pitos

0

tr api seviye 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));

Cevabınızın etrafında biraz daha bağlam sağlamalısınız.
Nicolas Grenié

0

Şimdi böyle uygulamanız gerekiyor

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

Tek bir kod satırını takip etmek yeterlidir, ContextCompat.getDrawable tarafından her şey halledilir

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

Bazıları için hala bu konunun önerisini uyguladıktan sonra bile bu sorunu çözmek için (ben böyle bir olurdu) Uygulama sınıfınıza onCreate () yöntemi bu satırı ekleyin

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

Burada ve burada önerildiği gibi bazen bu, özellikle menü öğeleriyle uğraşırken kaynaklardan vektörlere erişmek için gereklidir.


0

Kotlin'de uzantıyı kullanabilirsiniz

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

sonra gibi kullan

context.getMyDrawable(R.drawable.my_icon)

-2

Build.VERSION_CODES.LOLLIPOP şimdi BuildVersionCodes.Lollipop olarak değiştirilmelidir.

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}

BuildVersionCodesXamarin'e özgü bir sınıf değil mi?
Ted Hopp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.