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)

Odpowiedzi:


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

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

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)


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


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

0

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.