Wenn Sie setCompoundDrawables () aufrufen, wird Compound Drawable nicht angezeigt

321

Nachdem ich die setCompoundDrawablesMethode aufgerufen habe , wird die Verbindung Drawable nicht angezeigt.

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

Irgendwelche Gedanken?

Hunterp
quelle
9
Wie in den folgenden Antworten angegeben, muss die Variante der genannten Methode (..)WithIntrinsicBoundsaufgerufen werden. paddingNebenbei bemerkt, für das Compound Drawable muss nach diesem Aufruf gesetzt werden, um einen Effekt zu verursachen
Dr1Ku
6
Das Dokument sagt: Die Drawables müssen bereits setBounds(Rect)angerufen haben.
Hallo Hunterp, ich habe dich gerade im Coffee Shop (Angel) getroffen. Jetzt, da ich weiß, dass du weißt, was Android Drawables sind (und vielleicht hast du bei der Arbeit mit vielen von ihnen Speicherfehler festgestellt), kann ich dir einige davon erzählen Die Projekte, an denen ich mitgearbeitet habe, mussten sich mit diesem Problem befassen. Schauen Sie sich github.com/JakeWharton/DiskLruCache an (das ich zusammengearbeitet habe, um es
androidfreundlicher
@ Dr1Ku Eigentlich habe ich es schon mal und es funktioniert trotzdem.
Sotti

Antworten:

629

Ich musste benutzen setCompoundDrawablesWithIntrinsicBounds.

Hunterp
quelle
7
braucht API 17, damit Drawable.setBounds () besser sein könnte
user1324936
6
Vielen Dank. Das funktioniert für mich. Darf ich wissen, was der Unterschied zwischen diesen beiden ist?
AndEngine
1
@ user1324936 Die 'relative' Version erfordert API 17, andere können mit früheren Versionen verwendet werden
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds wurde in API Level 3
Greg Ennis
Ich habe setCompoundDrawableRelativeWithIntrinsicBounds <verwendet - dieses wurde auf API 17 hinzugefügt. Achten Sie auf die Intellisense.
Neon Warge
69

Verwenden Sie dies (ich habe getestet). Es funktioniert gut

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 );
arischer Bahmani
quelle
1
Dies ist nützlich, wenn Sie auf APIs mit weniger als 17 abzielen, da EditText#setCompoundDrawablesWithIntrinsicBoundsmindestens API 17 erforderlich ist.
Krøllebølle
6
Können Sie eine Quelle dafür angeben? Die gesamte Dokumentation, die ich gesehen habe, zeigt, dass dies seit API 1 verfügbar ist .
Kurifu
48

Das Bild ist leer, da es keine festgelegten Grenzen hat. Sie können verwenden, setCompoundDrawables()aber bevor Sie die Bildgrenzen mit der Drawable.setBounds()Methode angeben sollten

teoREtik
quelle
1
Beste Antwort, weil Sie tatsächlich begründen, warum setBounds wichtig ist.
Andy
@Andy Genau, hassen Sie diese Top-Antworten mit 800 Stimmen, die nur eine Codezeile ohne Worte
kopiert kopiert
44

Beispiel oben gesetzt:

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

Reihenfolge der Argumente: (links, oben, rechts, unten)

Andrey
quelle
1
Dies sollte die akzeptierte Antwort sein, in meinem Fall mit der Schaltfläche. und es hat wie erwartet funktioniert !!! Es ist auch abwärtskompatibel.
Mochadwi
22

Wieder ein bisschen einfacher:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );
Alecs
quelle
10

Es ist in API 22 veraltet.

Dieser Code ist nützlich für mich:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);
許維德
quelle
3

In Kotlin:

1) Stellen Sie ein drawable:

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

oder

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

2) Stellen Sie ein TextView:

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

oder

button.setCompoundDrawables(null, drawable, null, null)
CoolMind
quelle
Für Textview setCompoundDrawablesWithIntrinsicBoundswird funktioniert ..
Akash Bisariya
1

Beispiel mit Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)
mike.tihonchik
quelle
0

Das Bild wird nicht angezeigt, da Sie die Grenzen nicht angegeben haben. Sie haben hier also zwei Möglichkeiten.

1. Methode

Verwenden Sie setCompoundDrawablesWithIntrinsicBoundsdie unten gezeigte Methode

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

2. Methode

Sie können Grenzen auf das Zeichenelement anwenden, bevor Sie es auf die Textansicht anwenden, wie unten gezeigt

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

Das ist es.

Asad Ali Choudhry
quelle