Impostato programmaticamente a sinistra disegnabile in TextView


285

Ho un textView in XML qui.

<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"/>

Come puoi vedere ho impostato DrawableLeft in xml.

Vorrei cambiare il disegno nel codice.

Esiste un modo per farlo? O impostare il drawable Hai lasciato il codice per la visualizzazione del testo?

Risposte:


781

È possibile utilizzare setCompoundDrawablesWithIntrinsicBounds (int left, int top, int right, int bottom)

imposta 0 dove non vuoi immagini

Esempio di Drawable a sinistra:

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

Suggerimento: ogni volta che conosci un attributo XML ma non hai la minima idea di come usarlo in fase di esecuzione. vai alla descrizione di quella proprietà nel documento dello sviluppatore. Qui troverai i metodi correlati se è supportato in fase di esecuzione. cioè per DrawableLeft


Quindi, dove posso impostare il disegno in questo metodo?
coder_For_Life22

1
+1 Funziona per l'impostazione di android: drawableLeft per TextView a livello di programmazione. Grazie
Paresh Mayani, il

35
+1 per l'aggiunta del suggerimento. quella dovrebbe essere la prima cosa che viene raccontata agli sviluppatori quando usano i documenti
gmjordan

@BrainCrash Hai ragione, l'ho scambiato con il metodo più recente che ha lo stesso nome.
imperatore deatore

2
Ciao stavo usando questo metodo per impostare i disegni, ma non sono riuscito a trovare la sua controparte migliore. Ho dovuto verificare se la vista di testo composta ha qualche disegno. Come lo faccio? Ho provato a confrontarmi textview.getCompoundDrawablesRelative()[0]conmContext.getResources().getDrawable(R.drawable.my_drawable)
ravi il



1

Utilizzando Kotlin:

È possibile creare una funzione di estensione o semplicemente utilizzare setCompoundDrawablesWithIntrinsicBoundsdirettamente.

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

Se è necessario ridimensionare il disegno, è possibile utilizzare questa funzione di estensione.

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

Per essere davvero fantasioso, crea un involucro che consenta di modificare dimensioni e / o colori.

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

0

Un'estensione Kotlin + alcune imbottiture attorno al disegno

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

0

ci sono due modi per farlo o puoi usare XML o Java per esso. Se è statico e non richiede modifiche, è possibile inizializzare in XML.

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

Ora, se è necessario modificare le icone in modo dinamico, è possibile farlo chiamando le icone in base agli eventi

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);

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

Questo non risponde alla domanda. È prevista una risposta correlata a TextView.
Rick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.