Llamar a setCompoundDrawables () no muestra Compound Drawable


323

Después de llamar al setCompoundDrawablesmétodo, no se muestra el Drawable compuesto.

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

¿Alguna idea?


99
Como se indica en las respuestas a continuación, (..)WithIntrinsicBoundsdebe llamarse a la variante del método nombrado . En una nota al margen, paddingpara que el Compuesto Dibujable se debe configurar después de esta llamada para causar un efecto
Dr1Ku

66
El documento dice: Los Drawables ya deben haber setBounds(Rect)llamado.

hola hunterp, acabo de conocerte en la cafetería (Angel), ahora que sé que sabes qué son los Drawables de Android (y tal vez has encontrado memoria por errores de error al trabajar con muchos de ellos), puedo contarte algunos de los proyectos que he colaborado tuvieron que lidiar con este problema, echa un vistazo a github.com/JakeWharton/DiskLruCache (que colaboré para hacer más amigable para Android) que utiliza Picasso ( github.com/square/picasso )
Gubatron

@ Dr1Ku En realidad lo tengo antes y funciona de todos modos.
Sotti

Respuestas:


629

Necesitaba estar usando setCompoundDrawablesWithIntrinsicBounds.


77
necesita la API 17, por lo que Drawable.setBounds () podría ser mejor
user1324936

66
muchas gracias ... esto funciona para mí ... ¿puedo saber cuál es la diferencia entre estos dos?
AndEngine

1
@ user1324936 La versión 'relativa' requiere API 17, otras pueden usarse con versiones anteriores
milosmns

11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds se agregó en API Nivel 3
Greg Ennis el

Estaba usando setCompoundDrawableRelativeWithIntrinsicBounds <- este se agregó en la API 17. Tenga cuidado con el intellisense.
Neon Warge

69

Use esto (lo probé). Funciona bien

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );

1
Esto es útil cuando se apunta a API inferiores a 17, ya que EditText#setCompoundDrawablesWithIntrinsicBoundsrequiere al menos API 17.
Krøllebølle

66
¿Puedes proporcionar una fuente para eso? Toda la documentación que he visto indica que ha estado disponible desde la API 1 .
Kurifu

48

La imagen está en blanco porque no tiene límites especificados. Puede usar, setCompoundDrawables()pero antes de especificar los límites de la imagen, use el Drawable.setBounds()método


1
La mejor respuesta porque realmente proporciona el razonamiento de por qué setBounds es importante.
Andy

@Andy Exactamente, odio estas respuestas principales con 800 votos que solo copian una línea de código pegada sin palabras
Big_Chair

44

Ejemplo establecido en la parte superior:

view.setCompoundDrawablesWithIntrinsicBounds(
    null,
    getResources().getDrawable(R.drawable.some_img),
    null,
    null
);

orden de argumentos: (izquierda, arriba, derecha, abajo)


1
Esta debería ser la respuesta aceptada, en mi caso usando el botón. y funciona como se esperaba !!! También es compatible con versiones anteriores.
mochadwi

22

Un poco más simple de nuevo:

Drawable image = context.getResources().getDrawable(R.drawable.ic_action );
image.setBounds( 0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight() );
button.setCompoundDrawables( image, null, null, null );

10

Está en desuso en API 22.

Este código es útil para mí:

Drawable drawable = ResourcesCompat.getDrawable(getResources(),R.drawable.wen, null);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),
drawable.getMinimumHeight());
tv.setCompoundDrawables(drawable, null, null, null);

3

En Kotlin:

1) Conjunto drawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

o

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) Conjunto TextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

o

button.setCompoundDrawables(null, drawable, null, null)

Para Textview setCompoundDrawablesWithIntrinsicBoundsfuncionó ..
Akash Bisariya


1

Ejemplo con Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)

0

La imagen no se muestra porque no especificó los límites, por lo que tiene 2 opciones aquí.

1er método

Use el setCompoundDrawablesWithIntrinsicBoundsmétodo, como se muestra a continuación

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

2do método

Puede aplicar límites al dibujable antes de aplicar a TextView, como se muestra a continuación

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

Eso es.

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.