Android paketindeki bir kaynak kimliğinden bir Çekilebilir nesne nasıl elde edersiniz?


156

Bir görüntü düğmesi üzerinde görüntülemek için bir Drawable nesnesi almak gerekiyor. Android.R.drawable. * Paketinden bir nesne almak için aşağıdaki kodu (veya bunun gibi bir şeyi) kullanmanın bir yolu var mı?

örneğin drawableId android.R.drawable.ic_delete olsaydı

mContext.getResources().getDrawable(drawableId)

Yanıtlar:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

Ayrıca uygulama bağlamını kullanmanın işe yaradığını gördüm, teşekkürler.
Blaskovicz

20
API 22'den itibaren getDrawable(int id)kullanımdan kaldırılmıştır. getDrawable(int id, Resources.Theme theme)Bunun yerine kullanın . Yöntem yardımcı getTheme()olmalıdır.
Isaac Zais

1
Küçük bir şüphe var. Bu kodda "Yöntem tür kaynaklardan getDrawable (int) kullanımdan kaldırıldı". Bir SO cevabına göre 1. Java'da Kullanımdan kaldırılmış yöntemler veya sınıflar kullanmak yanlış mı? Kullanımdan kaldırılmış tanımından: "@Deprecated'e ek açıklama eklenmiş bir program öğesi, programcıların genellikle tehlikeli olduğu veya daha iyi bir alternatif olduğu için kullanmaktan vazgeçtiği bir öğedir." Bunun için daha iyi bir alternatif.
Katil

107

İtibariyle API 21 , kullanmak gerekir getDrawable(int, Theme)yerine yöntemi getDrawable(int)bu bir almasına olanak tanır olarak, drawablebelirli bir ilişkili nesnesi resource IDgöz önüne alındığında için screen density/theme. Arayan deprecated getDrawable(int)yöntemini çağırmak aynıdır getDrawable(int, null).

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

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

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

context.getDrawable(id);eşdeğer gibi görünüyorresources.getDrawable(id, context.getTheme());
ErickBergmann

Destek kitaplığınız varsa bu bir satırda yapılabilir:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

API 21'den itibaren şunları da kullanabilirsiniz:

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

Onun yerine ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
Seçim için daha fazla açıklama
verebilir misiniz

3

en iyi yol

 button.setBackgroundResource(android.R.drawable.ic_delete);

VEYA bu Çekilebilir sol için ve bunun gibi bir şey için sağ vb.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

ve

getResources().getDrawable() şimdi kullanımdan kaldırıldı


0

API 21'den getDrawable(int id)kullanımdan kaldırıldı. Yani şimdi kullanmalısın

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Ancak yapmanın en iyi yolu: Çekilebilir ve renkler elde etmek için tek bir ortak sınıf oluşturmanız gerekir, çünkü gelecekte herhangi bir şey değişirse veya kullanımdan kaldırılırsa, projenizin her yerini değiştirmenize gerek yoktur.

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

bu yöntemi aşağıdaki gibi kullanın:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

0

Kotlin programcıları için bir çözümün ardından (API 22'den)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
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.