In einer Textansicht programmgesteuert links zeichnbar setzen

285

Ich habe hier eine Textansicht in XML.

<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 DrawableLeft in XML gesetzt.

Ich möchte das Drawable im Code ändern.

Gibt es überhaupt etwas zu tun? Oder setzen Sie die drawableLeft im Code für die Textansicht?

coder_For_Life22
quelle

Antworten:

781

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

Setzen Sie 0, wenn Sie keine Bilder möchten

Beispiel für Drawable links:

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

Tipp: Wann immer Sie ein XML-Attribut kennen, aber keine Ahnung haben, wie es zur Laufzeit verwendet werden soll. Gehen Sie einfach zur Beschreibung dieser Eigenschaft im Entwicklerdokument. Dort finden Sie Verwandte Methoden, wenn diese zur Laufzeit unterstützt werden. dh für DrawableLeft

BrainCrash
quelle
Wo setze ich das Zeichen bei dieser Methode?
coder_For_Life22
1
+1 Es funktioniert zum Einstellen von Android: drawableLeft für TextView programmgesteuert.
Vielen Dank
35
+1 für das Hinzufügen des Trinkgeldes. Das sollte das allererste sein, was Entwicklern bei der Verwendung der Dokumente
gesagt wird
@BrainCrash Du hast recht, ich habe es mit der neueren Methode verwechselt, die den gleichen Namen hat.
Todeskaiser
2
Hallo, ich habe diese Methode verwendet, um die Drawables festzulegen, aber ich konnte das Getter-Gegenstück nicht finden. Ich musste überprüfen, ob die zusammengesetzte Textansicht etwas Zeichnungsfähiges hat. Wie mache ich das? Versucht textview.getCompoundDrawablesRelative()[0]mitmContext.getResources().getDrawable(R.drawable.my_drawable)
Ravi
6

Sie können eine der folgenden Methoden verwenden, um das Drawable in TextView festzulegen:

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

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

Und um aus Ressourcen schöpfbar zu werden, können Sie Folgendes verwenden:

getResources().getDrawable(R.drawable.your_drawable_id);
Shajeel Afzal
quelle
Nein, setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) ist API Levet 3 von Ihrem eigenen Link ...
BrainCrash
1

Kotlin verwenden:

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

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

Wenn Sie die Größe des Zeichens ä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)
}

Erstellen Sie einen Wrapper, der Größen- und / oder Farbänderungen ermöglicht, um wirklich ausgefallen zu werden.

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)
}
Gibolt
quelle
0

Eine Kotlin-Erweiterung + etwas Polsterung um das Drawable

fun TextView.addDrawable(drawable: Int) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}
r3dm4n
quelle
0

Es gibt zwei Möglichkeiten, entweder XML oder Java zu verwenden. Wenn es statisch ist und keine Änderungen erfordert, können Sie es in XML initialisieren.

  android:drawableLeft="@drawable/cloud_up"
    android:drawablePadding="5sp"

Wenn Sie nun die Symbole dynamisch ändern müssen, können Sie dies tun, indem Sie die Symbole basierend auf den Ereignissen aufrufen

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);
Ayan Bhattacharjee
quelle
-8
static private Drawable **scaleDrawable**(Drawable drawable, int width, int height) {

    int wi = drawable.getIntrinsicWidth();
    int hi = drawable.getIntrinsicHeight();
    int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
    float scale = (dimDiff > 0) ? width / (float)wi : height /
            (float)hi;
    Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
    drawable.setBounds(bounds);
    return drawable;
}
Rashmi P.
quelle
Dies beantwortet die Frage nicht. Eine TextView-bezogene Antwort wird erwartet.
Rick