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?


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

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

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


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)


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

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

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)

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)

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.