Como criar Drawable a partir do recurso

283

Eu tenho uma imagem res/drawable/test.png(R.drawable.test).
Quero passar esta imagem para uma função que aceite Drawable, por exemplo mButton.setCompoundDrawables().

Então, como posso converter um recurso de imagem em um Drawable?

Usuário7723337
fonte

Respostas:

567

Sua atividade deve ter o método getResources. Faz:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );
Jems
fonte
2
Se você quiser isso fora de uma classe Activity, precisará encontrar outra maneira de acessar o Contexto onde vive getResources (); esta resposta recomenda passá-lo para o construtor
rymo
50
A partir da API versão 21, esse método está obsoleto e você deve ser substituído por: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren
3
@Boren é o mesmo que usar ContextCompat.getDrawable (this, R.drawable.icon) ;?
Zach
2
Nenhuma das sugestões acima parece funcionar se R.drawable.icon for um Vector drawable.
FractalBob 29/05
4
NÃO O UTILIZE SE ESTIVER USANDO VETOR DRAWABLE. Use AppCompatResources.getDrawable (contexto, R.drawable.icon).
Dhaval Patel
136

Este código está obsoleto:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Use isto:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);
daniel kilinskas
fonte
11
Esteja ciente de que isso aplicará o tema a partir do contexto fornecido. Se você deseja garantir que nenhum tema seja usado, você pode usar ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(onde o terceiro parâmetro é uma instância opcional do Tema).
vaughandroid
23

O getDrawable (int id)método está depreciado a partir da API 22.

Em vez disso, você deve usar o getDrawable (int id, Resources.Theme theme)API 21+

Código seria algo parecido com isto.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}
Chris Stillwell
fonte
por que não passar nulo para cada API? Plus: Tem certeza de que nulo é a melhor opção?
jonathanrz
1
O getDrawable (id int, Resources.Theme tema) não aconteceu até API 21.
Chris Stillwell
ougetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone
13

Gostaria apenas de acrescentar que, se você estiver recebendo a mensagem "obsoleta" ao usar o getDrawable (...), use o seguinte método da biblioteca de suporte.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

Você não precisa usar getResources () ao usar esse método.

Isso é equivalente a fazer algo como

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

Isso funciona nas versões pré e pós-pirulito.

Sameer Khanal
fonte
4

Obtenha Drawable a partir de recursos vetoriais, independentemente de seu vetor ou não:

AppCompatResources.getDrawable(context, R.drawable.icon);

Nota:
ContextCompat.getDrawable(context, R.drawable.icon); produzirá android.content.res.Resources$NotFoundExceptionpara recurso vetorial.

Dhaval Patel
fonte
3

Se você estiver tentando obter o desenho da vista em que a imagem está definida como,

ivshowing.setBackgroundResource(R.drawable.one);

o drawable retornará apenas valor nulo com o seguinte código ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Portanto, é melhor definir a imagem com o código a seguir, se você quiser recuperar o desenho de uma exibição específica.

 ivshowing.setImageResource(R.drawable.one);

somente então o drawable será convertido exatamente.

Excepcional
fonte
1

Se você está herdando de um fragmento, pode fazer:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

vorwerg-ni
fonte