Comment définir par programme drawableLeft sur le bouton Android?

Je crée dynamicment des boutons. Je les ai stylés en utilisant d’abord XML, et j’essaye de prendre le XML ci-dessous et de le rendre programmatique.

 

C’est ce que j’ai jusqu’ici. Je peux tout faire sauf le dessinable.

 linear = (LinearLayout) findViewById(R.id.LinearView); Button button = new Button(this); button.setText("Button"); button.setOnClickListener(listener); button.setLayoutParams( new LayoutParams( android.view.ViewGroup.LayoutParams.FILL_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT ) ); linear.addView(button); 

Pour cela, vous pouvez utiliser la méthode setCompoundDrawables . Voir l’exemple ici . Je l’ai utilisé sans utiliser les setBounds et cela a fonctionné. Vous pouvez essayer l’une ou l’autre manière.

UPDATE : Copier le code ici si le lien tombe en panne

 Drawable img = getContext().getResources().getDrawable( R.drawable.smiley ); img.setBounds( 0, 0, 60, 60 ); txtVw.setCompoundDrawables( img, null, null, null ); 

ou

 Drawable img = getContext().getResources().getDrawable( R.drawable.smiley ); txtVw.setCompoundDrawablesWithInsortingnsicBounds( img, null, null, null); 

ou

 txtVw.setCompoundDrawablesWithInsortingnsicBounds( R.drawable.smiley, 0, 0, 0); 

Tout simplement vous pouvez essayer cela aussi

 txtVw.setCompoundDrawablesWithInsortingnsicBounds(R.drawable.smiley, 0, 0, 0); 

Pour moi, cela a fonctionné:

 button.setCompoundDrawablesWithInsortingnsicBounds(com.example.project1.R.drawable.ic_launcher, 0, 0, 0); 
 myEdtiText.setCompoundDrawablesWithInsortingnsicBounds( R.drawable.smiley,0, 0, 0); 

J’ai fait ça:

  // Left, top, right, bottom drawables. Drawable[] drawables = button.getCompoundDrawables(); // get left drawable. Drawable leftCompoundDrawable = drawables[0]; // get new drawable. Drawable img = getContext().getResources().getDrawable(R.drawable.ic_launcher); // set image size (don't change the size values) img.setBounds(leftCompoundDrawable.getBounds()); // set new drawable button.setCompoundDrawables(img, null, null, null); 

Pourrait être utile:

 TextView location; location=(TextView)view.findViewById(R.id.complain_location); //in parameter (left,top,right,bottom) any where you wnat to put location.setCompoundDrawablesWithInsortingnsicBounds(0, 0, R.drawable.arrow,0); 

comme @ Jérémy Reynaud le souligne, comme décrit dans cette réponse , le moyen le plus sûr de définir le dessin à gauche sans modifier les valeurs des autres tirables (en haut, à droite et en bas) est d’utiliser les valeurs précédentes du bouton avec setCompoundDrawablesWithInsortingnsicBounds :

 Drawable leftDrawable = getContext().getResources() .getDrawable(R.drawable.yourdrawable); // Or use ContextCompat // Drawable leftDrawable = ContextCompat.getDrawable(getContext(), // R.drawable.yourdrawable); Drawable[] drawables = button.getCompoundDrawables(); button.setCompoundDrawablesWithInsortingnsicBounds(leftDrawable,drawables[1], drawables[2], drawables[3]); 

Ainsi, tous vos tirages précédents seront préservés.

Essaye ça:

 ((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100);