我正在动态创建按钮。我首先使用XML来设置它们的样式,我正在尝试使用下面的XML并使其成为编程。
<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);
答案 0 :(得分:917)
您可以使用setCompoundDrawables
方法执行此操作。请参阅示例here。我在没有使用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);
答案 1 :(得分:82)
您也可以试试这个
txtVw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.smiley, 0, 0, 0);
答案 2 :(得分:13)
对我来说,它有效:
button.setCompoundDrawablesWithIntrinsicBounds(com.example.project1.R.drawable.ic_launcher, 0, 0, 0);
答案 3 :(得分:12)
myEdtiText.setCompoundDrawablesWithIntrinsicBounds( R.drawable.smiley,0, 0, 0);
答案 4 :(得分:7)
Kotlin Version
使用以下代码片段向按钮添加一个可绘制对象:
val drawable = ContextCompat.getDrawable(context, R.drawable.ic_favorite_white_16dp)
button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
。
Important Point in Using Android Vector Drawable
当您使用 android vector drawable 并希望向后兼容 21以下的API 时,请将以下代码添加到:
在应用程序级别build.gradle
中:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
在应用程序类中:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
}
}
答案 5 :(得分:3)
我这样做了:
// 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);
答案 6 :(得分:2)
正如@JérémyReynaud指出的那样,如answer所述,设置左绘图而不更改其他绘图(顶部,右侧和底部)的值的最安全方法是使用之前的值来自setCompoundDrawablesWithIntrinsicBounds的按钮:
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都将被保留。
答案 7 :(得分:2)
以下是更改编辑文本中左侧图标的颜色并将其设置在左侧的方法。
Drawable img = getResources().getDrawable( R.drawable.user );
img.setBounds( 0, 0, 60, 60 );
mNameEditText.setCompoundDrawables(img,null, null, null);
int color = ContextCompat.getColor(this, R.color.blackColor);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
DrawableCompat.setTint(img, color);
} else {
img.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
答案 8 :(得分:2)
为我工作。在右侧设置可绘制
tvBioLive.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_close_red_400_24dp, 0)
答案 9 :(得分:1)
可能会有所帮助:
{{1}}
答案 10 :(得分:1)
如果您使用的是 drawableStart , drawableEnd , drawableTop 或 drawableBottom ;您必须使用“ setCompoundDrawablesRelativeWithIntrinsicBounds ”
edittext.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.anim_search_to_close, 0)
答案 11 :(得分:0)
尝试一下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
fillButton[i].setBackground(getBaseContext().getResources().getDrawable(R.drawable.drawable_name));
}
else{
fillButton[i].setBackgroundColor(Color.argb(255,193,234,203));
}
答案 12 :(得分:0)
如果您将经常这样做,则添加扩展名可使您的代码更具可读性。按钮扩展TextView;如果您想缩小范围,请使用Button。
fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}
要使用扩展程序,只需致电
view.leftDrawable(R.drawable.my_drawable)
任何时候您都需要清除,不传递参数或进行另一个名为removeDrawables
的扩展
答案 13 :(得分:-7)
试试这个:
((Button)btn).getCompoundDrawables()[0].setAlpha(btn.isEnabled() ? 255 : 100);