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)

Respostas:


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

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

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)


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


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

0

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.