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?


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

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

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


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)


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

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

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)

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)

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.