Establecer mediante programación izquierda dibujable en un TextView

285

Tengo un textView en xml aquí.

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

Como puede ver, configuré el DrawableLeft en xml.

Me gustaría cambiar el dibujo en el código.

¿Hay alguna forma de hacer esto? ¿O establecer el código drawableLeft en la vista de texto?

coder_For_Life22
fuente

Respuestas:

781

Puede usar setCompoundDrawablesWithIntrinsicBounds (int left, int top, int right, int bottom)

establece 0 donde no quieres imágenes

Ejemplo de Drawable a la izquierda:

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

Consejo: Siempre que conozca algún atributo XML pero no tenga idea de cómo usarlo en tiempo de ejecución. solo vaya a la descripción de esa propiedad en el documento del desarrollador. Allí encontrará métodos relacionados si es compatible en tiempo de ejecución. es decir, para DrawableLeft

BrainCrash
fuente
Entonces, ¿dónde configuro el dibujable en este método?
coder_For_Life22
1
+1 Funciona para configurar Android: drawableLeft para TextView mediante programación. Gracias compañero
Paresh Mayani
35
+1 por agregar la propina. eso debería ser lo primero que se les dice a los desarrolladores cuando usan los documentos
gmjordan
@BrainCrash Tienes razón, lo confundí con el método más nuevo que tiene el mismo nombre.
Deathemperor
2
Hola, estaba usando este método para configurar los elementos dibujables, pero no pude encontrar su contraparte getter. Tuve que verificar si la vista de texto Compuesto tiene algo dibujable. ¿Cómo puedo hacer eso? Intenté comparar textview.getCompoundDrawablesRelative()[0]conmContext.getResources().getDrawable(R.drawable.my_drawable)
ravi
1

Usando Kotlin:

Puede crear una función de extensión o simplemente usarla setCompoundDrawablesWithIntrinsicBoundsdirectamente.

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

Si necesita cambiar el tamaño del dibujo, puede usar esta función de extensión.

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

Para ser realmente elegante, cree un contenedor que permita la modificación de tamaño y / o color.

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
fuente
0

Una extensión de Kotlin + algo de relleno alrededor del dibujo

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

Hay dos formas de hacerlo: puede usar XML o Java para ello. Si es estático y no requiere cambios, puede inicializar en XML.

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

Ahora, si necesita cambiar los íconos dinámicamente, puede hacerlo llamando a los íconos en función de los eventos

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);
Ayan Bhattacharjee
fuente
-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
fuente
Esto no responde la pregunta. Se espera una respuesta relacionada con TextView.
Rick