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.