Como você obtém um objeto Drawable a partir de uma identificação de recurso no pacote android?

156

Preciso obter um objeto Drawable para exibir em um botão de imagem. Existe uma maneira de usar o código abaixo (ou algo parecido) para obter um objeto do pacote android.R.drawable. *?

por exemplo, se drawableId fosse android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
fonte

Respostas:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
fonte
Também descobri que o uso do contexto do aplicativo parece funcionar, obrigado.
Blaskovicz 19/10/11
20
A partir da API 22. getDrawable(int id)está obsoleta. Use em getDrawable(int id, Resources.Theme theme)vez disso. O método getTheme()deve ser útil.
Isaac Zais
1
Tenho uma pequena dúvida. Neste código "O método getDrawable (int) do tipo Resources está obsoleto". De acordo com uma resposta do SO 1. É errado usar métodos ou classes reprovados em Java? A partir da definição de obsoleto: "Um elemento do programa anotado como @ Deprecated é aquele que os programadores são desencorajados de usar, geralmente por ser perigoso ou por existir uma alternativa melhor." Qual é a melhor alternativa para isso.
Assassino
107

Na API 21 , você deve usar o getDrawable(int, Theme)método em vez de getDrawable(int), pois permite buscar um drawableobjeto associado a um determinado resource IDdado screen density/theme. Chamar o deprecated getDrawable(int)método é equivalente a chamar getDrawable(int, null).

Você deve usar o seguinte código da biblioteca de suporte:

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

Usar este método é equivalente a chamar:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
fonte
context.getDrawable(id);parece ser equivalente aresources.getDrawable(id, context.getTheme());
ErickBergmann 7/17/17
Isso pode ser feito em uma linha se você tiver a biblioteca de suporte:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

A partir da API 21, você também pode usar:

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

Ao invés de ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Zain
fonte
2
Poderia fornecer uma explicação adicional para a escolha
Nyandika
3

melhor maneira é

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

OU isso para Drawable esquerda e algo assim para a direita etc.

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

e

getResources().getDrawable() agora está obsoleto

Inzimam Tariq IT
fonte
0

A partir da API 21 getDrawable(int id)está obsoleta. Então agora você precisa usar

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

Mas a melhor maneira de fazer isso é: você deve criar uma classe comum para desenhar e desenhar, porque se alguma coisa mudar ou se depreciar no futuro, você não precisará mudar em qualquer lugar do projeto.

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

use este método como:

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

Seguindo uma solução para programadores Kotlin (da API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Jens van de Mötter
fonte