Jak uzyskać obiekt do rysowania z identyfikatora zasobu w pakiecie Androida?

156

Chcę, aby obiekt do rysowania był wyświetlany na przycisku obrazu. Czy istnieje sposób na użycie poniższego kodu (lub czegoś podobnego), aby pobrać obiekt z pakietu android.R.drawable. *?

na przykład jeśli drawableId to android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
źródło

Odpowiedzi:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
źródło
Zauważyłem również, że używanie kontekstu aplikacji wydaje się działać, dzięki.
Blaskovicz
20
Od API 22. getDrawable(int id)jest przestarzałe. Użyj getDrawable(int id, Resources.Theme theme)zamiast tego. Metoda getTheme()powinna być pomocna.
Isaac Zais
1
Mam małą wątpliwość. W tym kodzie „Metoda getDrawable (int) z typu Resources jest przestarzała”. Według jednej odpowiedzi SO 1. Czy używanie przestarzałych metod lub klas w Javie jest złe? Z definicji przestarzałego: „Element programu z adnotacją @Deprecated to taki, którego programiści nie powinni używać, zwykle dlatego, że jest niebezpieczny lub dlatego, że istnieje lepsza alternatywa”. Jaka jest lepsza alternatywa dla tego.
Killer
107

Od API 21 należy getDrawable(int, Theme)zamiast tego używać metody getDrawable(int), ponieważ pozwala ona pobrać drawableobiekt powiązany z konkretnym resource IDdla danego screen density/theme. Wywołanie deprecated getDrawable(int)metody jest równoznaczne z wywołaniem getDrawable(int, null).

Zamiast tego należy użyć następującego kodu z biblioteki wsparcia:

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

Użycie tej metody jest równoznaczne z wywołaniem:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
źródło
context.getDrawable(id);wydaje się być odpowiednikiemresources.getDrawable(id, context.getTheme());
ErickBergmann
Można to zrobić w jednej linii, jeśli masz bibliotekę wsparcia:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

Od API 21 możesz również użyć:

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

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

Zain
źródło
2
Czy mógłbyś podać dalsze wyjaśnienie wyboru
Nyandika
3

najlepszy sposób

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

LUB to do rysowania po lewej stronie i coś takiego po prawej itp.

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

i

getResources().getDrawable() jest teraz przestarzała

Inzimam Tariq IT
źródło
0

Z API 21 getDrawable(int id)jest przestarzałe. Więc teraz musisz użyć

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

Ale najlepszym sposobem na to jest: Powinieneś stworzyć jedną wspólną klasę do rysowania i kolorów, ponieważ jeśli w przyszłości coś się zmieni lub zdezaktualizuje, nie musisz zmieniać w każdym miejscu projektu. Po prostu zmień tę metodę.

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

użyj tej metody jak:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);
Sanjayrajsinh
źródło
0

Podążanie za rozwiązaniem dla programistów Kotlin (z API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Jens van de Mötter
źródło