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.