La chiamata a setCompoundDrawables () non visualizza il Drawable composto


323

Dopo che chiamo il setCompoundDrawablesmetodo, il Drawable composto non viene mostrato.

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

qualche idea?


9
Come indicato nelle risposte di seguito, è (..)WithIntrinsicBoundsnecessario chiamare la variante del metodo denominato. Una nota paddinga margine , perché il Drawable composto deve essere impostato dopo questa chiamata per causare un effetto
Dr1Ku

6
Il documento dice: I Drawable devono aver già setBounds(Rect)chiamato.

ciao cacciatore, ti ho appena incontrato al bar (Angel), ora che so che sai cosa sono i Drawable Android (e forse hai colpito la memoria per errori di errore quando lavori con molti di essi), posso parlarti di alcuni dei i progetti a cui ho collaborato hanno dovuto affrontare questo problema, controlla github.com/JakeWharton/DiskLruCache (con cui ho collaborato per rendere più Android friendly) che viene utilizzato da Picasso ( github.com/square/picasso )
Gubatron

@ Dr1Ku In realtà ce l'ho prima e funziona comunque.
Sotti

Risposte:


629

7
ha bisogno di api 17 quindi Drawable.setBounds () potrebbe essere migliore
user1324936

6
grazie mille .. questo funziona per me .. posso sapere qual è la differenza tra questi due?
AndEngine,

1
@ user1324936 La versione 'relativa' richiede API 17, altre possono essere utilizzate con le versioni precedenti
milosmns,

11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds è stato aggiunto nel Livello API 3
Greg Ennis

Stavo usando setCompoundDrawableRelativeWithIntrinsicBounds <- questo è stato aggiunto all'API 17. Fai attenzione all'intellisense.
Neon Warge,

69

Usa questo (ho testato). Funziona bene

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
Ciò è utile quando si targetizza API inferiori a 17, poiché EditText#setCompoundDrawablesWithIntrinsicBoundsrichiede almeno API 17.
Krøllebølle

6
Puoi fornire una fonte per questo? Tutta la documentazione che ho visto indica che questo è disponibile dall'API 1 .
Kurifu,

48

L'immagine è vuota perché non ha limiti specificati. Puoi usare setCompoundDrawables()ma prima di specificare i limiti dell'immagine, usando il Drawable.setBounds()metodo


1
La migliore risposta perché in realtà fornisci il ragionamento sul perché setBounds è importante.
Andy,

@Andy Esattamente, odio queste risposte migliori con 800 voti che copiano semplicemente una riga di codice incollata senza parole
Big_Chair

44

Esempio impostato in alto:

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

ordine degli argomenti: (sinistra, in alto, a destra, in basso)


1
questa dovrebbe essere la risposta accettata, nel mio caso usando il pulsante. e funziona come previsto !!! Inoltre compatibilità con le versioni precedenti.
mochadwi,

22

Ancora un po 'più semplice:

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

10

È deprecato nell'API 22.

Questo codice è utile per me:

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

3

A Kotlin:

1) Set 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) Set TextView:

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

o

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

Per Textview setCompoundDrawablesWithIntrinsicBoundsfunzionerà ..
Akash Bisariya,


1

Esempio con Kotlin:

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

0

L'immagine non viene mostrata perché non hai specificato i limiti, quindi hai 2 opzioni qui.

1o metodo

Utilizzare il setCompoundDrawablesWithIntrinsicBoundsmetodo, come mostrato di seguito

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

2o metodo

È possibile applicare limiti al disegno prima di applicare a TextView, come mostrato di seguito

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

Questo è tutto.

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.