362 Stimmen

Linkes Drawable in einer TextView programmatisch setzen

Ich habe eine textView in xml hier.

<TextView
        android:id="@+id/bookTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/checkmark"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="24dip"
        android:maxLines="1"
        android:ellipsize="end"/>

Wie Sie sehen können, habe ich die DrawableLeft in xml festgelegt.

Ich möchte die Zeichenfläche im Code ändern.

Gibt es eine Möglichkeit, dies zu tun? Oder die drawableLeft in Code für die Textansicht zu setzen?

968voto

BrainCrash Punkte 12612

Sie können verwenden setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)

0 setzen, wenn Sie keine Bilder wollen

Beispiel für Drawable auf der linken Seite:

TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

Alternativ können Sie auch setCompoundDrawablesRelativeWithIntrinsicBounds um RTL/LTR-Layouts zu respektieren.


Tipp: Wann immer Sie ein XML-Attribut kennen, aber keine Ahnung haben, wie Sie es zur Laufzeit verwenden können, gehen Sie einfach zur Beschreibung dieser Eigenschaft im Entwicklerdokument. Dort finden Sie Verwandte Methoden wenn es zur Laufzeit unterstützt wird, d.h. Für DrawableLeft

21voto

Gibolt Punkte 32347

Kotlin verwenden:

Sie können eine Erweiterungsfunktion erstellen oder einfach setCompoundDrawablesWithIntrinsicBounds direkt.

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
   this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

Wenn Sie die Größe der Zeichenfläche ändern müssen, können Sie diese Erweiterungsfunktion verwenden.

textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

Wenn Sie es ganz genau wissen wollen, erstellen Sie einen Wrapper, der die Änderung von Größe und/oder Farbe erlaubt.

textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
    val drawable = drawable(id)
    if (sizeRes != 0) {
        val size = resources.getDimensionPixelSize(sizeRes)
        drawable?.setBounds(0, 0, size, size)
    }
    if (color != 0) {
        drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    } else if (colorRes != 0) {
        val colorInt = ContextCompat.getColor(context, colorRes)
        drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
    }
    this.setCompoundDrawables(drawable, null, null, null)
}

17voto

Jack Punkte 9017

Von aquí Ich sehe die Methode setCompoundDrawablesWithIntrinsicBounds(int,int,int,int) kann dazu verwendet werden.

8voto

Shajeel Afzal Punkte 5744

Sie können eine der folgenden Methoden verwenden, um das Drawable auf TextView zu setzen:

1- setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)

2- setCompoundDrawables(Left_Drawable, Top_Drawable, Right_Drawable, Bottom_Drawable)

Und zu erhalten drawable von Ressourcen, die Sie verwenden können:

getResources().getDrawable(R.drawable.your_drawable_id);

5voto

r3dm4n Punkte 1023

Eine Kotlin-Erweiterung + einige Polsterung um das drawable

fun TextView.addLeftDrawable(drawable: Int, padding: Int = 32) {
    val imgDrawable = ContextCompat.getDrawable(context, drawable)
    compoundDrawablePadding = padding
    setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X