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?

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


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


6

Puede usar cualquiera de los siguientes métodos para configurar Drawable en TextView:

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

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

Y para obtener recursos de recursos que puede utilizar:

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

No, setCompoundDrawablesWithIntrinsicBounds (int, int, int, int) es API Levet 3 desde su propio enlace ...
BrainCrash

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

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

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

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

Esto no responde la pregunta. Se espera una respuesta relacionada con TextView.
Rick
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.