如何以编程方式在Androidbutton上设置drawableLeft?

我正在dynamic创buildbutton。 我首先使用XML对它们进行了样式devise,并且试图将下面的XML作为程序devise。

<Button android:id="@+id/buttonIdDoesntMatter" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="buttonName" android:drawableLeft="@drawable/imageWillChange" android:onClick="listener" android:layout_width="fill_parent"> </Button> 

这是我迄今为止。 我可以做任何事情,但可绘制。

 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); 

您可以使用setCompoundDrawables方法来执行此操作。 看到这里的例子。 我用这个没有使用setBounds ,它的工作。 你可以尝试任何一种方式。

更新 :在这里复制代码,防止链接失败

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

要么

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

要么

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

你也可以试试这个

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

对我来说,它工作:

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

我做到了这一点:

  // 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); 

正如@JérémyReynaud指出的那样,正如在这个答案中所描述的那样,在不改变其他可绘制的值(顶部,右侧和底部)的情况下设置左侧绘制的最安全的方法是使用setCompoundDrawablesWithIntrinsicBounds中的button的先前值:

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

所以你以前的drawable将被保留。

尝试像这样:

 ((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100); 
 String countryIso = objPrefs.getAddBusinessFlagCode(); countryIso = countryIso.toLowerCase(); add_business_country.setCompoundDrawablesWithIntrinsicBounds(getApplicationContext().getResources().getIdentifier("drawable/" + countryIso, null, getApplicationContext().getPackageName()), 0, 0, 0);