Jak stworzyć Drawable z zasobu

283

Mam obraz res/drawable/test.png(R.drawable.test).
Chcę przekazać ten obraz do funkcji, która akceptuje Drawablenp mButton.setCompoundDrawables().

Jak mogę przekonwertować zasób obrazu na Drawable?

User7723337
źródło

Odpowiedzi:

567

Twoja aktywność powinna mieć metodę getResources. Robić:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );
Jems
źródło
2
Jeśli chcesz tego poza klasą Activity, musisz znaleźć inny sposób na dotarcie do kontekstu, w którym mieszka getResources (); ta odpowiedź zaleca przekazanie go do konstruktora
rymo
50
Od wersji API 21 ta metoda jest przestarzała i należy ją zastąpić: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren
3
@Boren to to samo, co użycie ContextCompat.getDrawable (this, R.drawable.icon) ;?
Zach
2
Żadna z powyższych sugestii wydaje się nie działać, jeśli R.drawable.icon jest rysowalnym wektorem.
FractalBob
4
NIE UŻYWAJ TEGO, JEŚLI UŻYWASZ WEKTORA DRAWABLE. Zamiast tego należy użyć AppCompatResources.getDrawable (kontekst, R.drawable.icon).
Dhaval Patel
136

Ten kod jest przestarzały:

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

Zamiast tego użyj tego:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);
Daniel Kilinskas
źródło
11
Pamiętaj, że spowoduje to zastosowanie motywu z podanego kontekstu. Jeśli chcesz mieć pewność, że motyw nie jest używany, możesz go użyć ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(gdzie trzeci parametr jest opcjonalnym wystąpieniem motywu).
vaughandroid
23

getDrawable (int id)Sposób jest amortyzowane API 22.

Zamiast tego należy użyć getDrawable (int id, Resources.Theme theme)interfejsu API 21+

Kod wyglądałby mniej więcej tak.

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
źródło
dlaczego nie przekazać wartości null dla każdego interfejsu API? Plus: Czy jesteś pewien, że null jest najlepszą opcją?
jonathanrz
1
GetDrawable (int id, motyw Resources.Theme) pojawił się dopiero w API 21.
Chris Stillwell
lubgetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone,
13

Chciałbym tylko dodać, że jeśli otrzymujesz komunikat „przestarzały” podczas korzystania z getDrawable (...), powinieneś zamiast tego użyć następującej metody z biblioteki wsparcia.

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

Podczas korzystania z tej metody nie musisz używać getResources ().

Jest to równoważne z robieniem czegoś takiego

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

Działa to zarówno w wersjach Lollipop przed, jak i po.

Sameer Khanal
źródło
4

Uzyskaj Drawable z zasobu wektorowego niezależnie od tego, czy jest to wektor, czy nie:

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

Uwaga:
ContextCompat.getDrawable(context, R.drawable.icon); będzie produkować android.content.res.Resources$NotFoundExceptiondla zasobu wektorowego.

Dhaval Patel
źródło
3

Jeśli próbujesz uzyskać rysunek z widoku, w którym ustawiony jest obraz,

ivshowing.setBackgroundResource(R.drawable.one);

wtedy drawable zwróci tylko wartość zerową z następującym kodem ...

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

Lepiej więc ustawić obraz za pomocą następującego kodu, jeśli chcesz pobrać rysowanie z określonego widoku.

 ivshowing.setImageResource(R.drawable.one);

tylko wtedy drawable zostanie przekonwertowany dokładnie.

Wyjątkowy
źródło
1

Jeśli dziedziczysz po fragmencie, możesz:

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

vorwerg-ni
źródło