Wywołanie setCompoundDrawables () nie wyświetla Compound Drawable

322

Po wywołaniu setCompoundDrawablesmetody złożony Drawable nie jest wyświetlany.

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

jakieś pomysły?

Hunterp
źródło
9
Jak stwierdzono w odpowiedziach poniżej, (..)WithIntrinsicBoundsnależy wywołać wariant nazwanej metody . Na marginesie, paddingdla związku rozciągliwej musi być ustawiony po tej rozmowy, aby spowodować efekt
Dr1Ku
6
Dokument mówi: Do kanału alfa musi już nie setBounds(Rect)nazywa.
cześć Hunterp, właśnie spotkałem cię w kawiarni (Angel), teraz, gdy wiem, że wiesz, czym są Android Drawables (i być może natrafiłeś na pamięć z powodu błędów podczas pracy z wieloma z nich), mogę ci powiedzieć o niektórych projekty, z którymi współpracowałem, musiały poradzić sobie z tym problemem, sprawdź github.com/JakeWharton/DiskLruCache (z którym współpracowałem, aby uczynić bardziej przyjaznym dla systemu Android), z którego korzysta Picasso ( github.com/square/picasso )
Gubatron
@ Dr1Ku Właściwie mam to już wcześniej i i tak działa.
Sotti

Odpowiedzi:

629

Musiałem używać setCompoundDrawablesWithIntrinsicBounds.

Hunterp
źródło
7
potrzebuje interfejsu API 17, więc Drawable.setBounds () może być lepszy
user1324936
6
dziękuję bardzo .. to działa dla mnie .. czy mogę wiedzieć jaka jest różnica między tymi dwoma?
AndEngine
1
@ user1324936 Wersja „względna” wymaga API 17, inne mogą być używane z poprzednimi wersjami
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds został dodany do poziomu API 3
Greg Ennis
Korzystałem z setCompoundDrawableRelativeWithIntrinsicBounds <- ten został dodany do API 17. Uważaj na inteligencję.
Neon Warge
69

Użyj tego (przetestowałem). Działa dobrze

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );
aryan bahmani
źródło
1
Jest to przydatne, gdy EditText#setCompoundDrawablesWithIntrinsicBounds
kierujesz
6
Czy możesz podać źródło? Cała dokumentacja, którą widziałem, wskazuje, że jest dostępna od API 1 .
kurifu
48

Obraz jest pusty, ponieważ nie ma określonych granic. Możesz użyć, setCompoundDrawables()ale zanim określisz granice obrazu, używając Drawable.setBounds()metody

teoREtik
źródło
1
Najlepsza odpowiedź, ponieważ faktycznie podajesz uzasadnienie, dlaczego setBounds jest ważny.
Andy,
@ Andy Dokładnie, nienawidzę tych najważniejszych odpowiedzi z 800 głosami, które po prostu kopiują wklejoną jedną linię kodu bez słów
Big_Chair
44

Przykład ustawiony na górze:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

kolejność argumentów: (lewy, górny, prawy, dolny)

Andrey
źródło
1
to powinna być zaakceptowana odpowiedź, w moim przypadku za pomocą przycisku. i działa zgodnie z oczekiwaniami !!! To także kompatybilność wsteczna.
mochadwi
22

Jeszcze trochę prościej:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );
Alecs
źródło
10

Jest przestarzałe w API 22.

Ten kod jest dla mnie przydatny:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);
許維德
źródło
3

W Kotlinie:

1) Zestaw drawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

lub

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) Zestaw TextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

lub

button.setCompoundDrawables(null, drawable, null, null)
CoolMind
źródło
Dla Textview setCompoundDrawablesWithIntrinsicBoundszadziała ..
Akash Bisariya
1

Przykład z Kotlinem:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)
mike.tihonchik
źródło
0

Obraz nie jest wyświetlany, ponieważ nie określono granic, więc masz tutaj 2 opcje.

1. metoda

Użyj setCompoundDrawablesWithIntrinsicBoundsmetody, jak pokazano poniżej

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

2. metoda

Przed zastosowaniem do TextView możesz zastosować obwiednie do rysunku, jak pokazano poniżej

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

Otóż ​​to.

Asad Ali Choudhry
źródło