Chamar setCompoundDrawables () não exibe o Drawable composto

323

Depois de chamar o setCompoundDrawablesmétodo, o composto Drawable não é mostrado ..

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

Alguma ideia?

hunterp
fonte
9
Conforme indicado nas respostas abaixo, a variante do método nomeado (..)WithIntrinsicBoundsprecisa ser chamada. Em uma nota lateral, paddingpara o Drawable composto deve ser definido após esta chamada para causar efeito #
Dr1Ku
6
O documento diz: Os Drawables já devem ter setBounds(Rect)telefonado.
oi hunterp, acabei de conhecê-lo na cafeteria (Angel), agora que sei que você sabe o que são Drawables Android (e talvez você tenha atingido a memória devido a erros de erro ao trabalhar com muitos deles), posso falar sobre alguns dos os projetos que eu colaborei tiveram que lidar com esse problema, acesse github.com/JakeWharton/DiskLruCache (que colaborei para tornar o Android mais amigável), usado pelo Picasso ( github.com/square/picasso )
Gubatron
@ Dr1Ku Na verdade, eu tenho isso antes e funciona de qualquer maneira.
Sotti 6/03/2014

Respostas:

629

Eu precisava estar usando setCompoundDrawablesWithIntrinsicBounds.

hunterp
fonte
7
precisa api 17 modo Drawable.setBounds () pode ser melhor
user1324936
6
muito obrigado .. isso funciona para mim .. posso saber qual é a diferença entre esses dois?
AndEngine
1
@ user1324936 A versão 'relativa' requer API 17, outras podem ser usadas com versões anteriores
milosmns
11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds foi adicionado na API Nível 3
Greg Ennis
Eu estava usando setCompoundDrawableRelativeWithIntrinsicBounds <- este foi adicionado na API 17. Tenha cuidado com o intellisense.
Neon Warge
69

Use isto (eu testei). Funciona bem

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
fonte
1
Isto é útil quando APIs de segmentação inferior a 17, uma vez que EditText#setCompoundDrawablesWithIntrinsicBoundsrequer, pelo menos, API 17.
Krøllebølle
6
Você pode fornecer uma fonte para isso? Toda a documentação que eu vi indica que isso está disponível desde a API 1 .
kurifu
48

A imagem está em branco porque não possui limites especificados. Você pode usar, setCompoundDrawables()mas antes de especificar os limites da imagem, usando o Drawable.setBounds()método

teoREtik
fonte
1
Melhor resposta, porque você realmente fornece o raciocínio sobre a importância de setBounds.
1013 Andy
@Andy Exatamente, odeio essas respostas top com 800 votos que basta copiar coladas uma linha de código sem quaisquer palavras
Big_Chair
44

Exemplo definido para o topo:

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

ordem dos argumentos: (esquerda, superior, direita, inferior)

Andrey
fonte
1
essa deve ser a resposta aceita, no meu caso, usando o botão e funciona como esperado !!! Também compatibilidade com versões anteriores.
mochadwi
22

Um pouco mais simples novamente:

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

Ele foi descontinuado na API 22.

Este código é útil para mim:

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

Em Kotlin:

1) conjunto drawable:

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

ou

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)

ou

button.setCompoundDrawables(null, drawable, null, null)
CoolMind
fonte
Para Textview setCompoundDrawablesWithIntrinsicBoundsfuncionou ..
Akash Bisariya
1

Exemplo com Kotlin:

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

A imagem não é exibida porque você não especificou os limites; portanto, você tem duas opções aqui.

1º método

Use o setCompoundDrawablesWithIntrinsicBoundsmétodo, como mostrado abaixo

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

2º Método

Você pode aplicar limites ao drawable antes de aplicar ao TextView, conforme mostrado abaixo

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

É isso aí.

Asad Ali Choudhry
fonte