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?

Hunterp
fuente
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.

Hunterp
fuente
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 );
Aryan Bahmani
fuente
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

teoREtik
fuente
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)

Andrey
fuente
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 );
Alecs
fuente
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);
許維德
fuente
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)
CoolMind
fuente
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)
mike.tihonchik
fuente
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.

Asad Ali Choudhry
fuente