调用setCompoundDrawables()不会显示Composite Drawable


322

调用该setCompoundDrawables方法后,未显示复合Drawable。

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

有什么想法吗?


9
如以下答案中所述,(..)WithIntrinsicBounds需要调用命名方法的变体。附带说明一下,padding必须此调用之后设置“复合可绘制对象”才能产生效果
Dr1Ku12 2012年

6
文件说:在绘图资源必须已经有setBounds(Rect)所谓的。

嗨,hunterp,我刚在咖啡厅(Angel)遇到了您,现在我知道您知道什么是Android Drawables(也许您在处理其中许多错误时会遇到内存错误),我可以告诉您一些我合作的项目必须处理此问题,请查看Picasagithub.com/square/picasso)所使用的github.com/JakeWharton/DiskLruCache(我与之合作使Android更友好)
Gubatron

@ Dr1Ku实际上我以前有过它,并且仍然可以工作。
索蒂2014年

Answers:


629

7
需要api 17,所以Drawable.setBounds()可能会更好
user1324936 2014年

6
非常感谢你..这对我有用..我能知道这两者之间有什么区别吗?
AndEngine 2014年

1
@ user1324936“相对”版本需要API 17,其他版本也可以与以前的版本一起使用
milosmns 2015年

11
@ user1324936 setCompoundDrawablesWithIntrinsicBounds已添加到API级别3
Greg Ennis,

我正在使用setCompoundDrawableRelativeWithIntrinsicBounds <-,这是在API 17上添加的。请注意intellisense。
霓虹灯Warge'Dec 21'16

69

使用这个(我测试过)。效果不错

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
当定位低于17的API时,这很有用,因为它EditText#setCompoundDrawablesWithIntrinsicBounds至少需要
API17。

6
您可以为此提供资源吗?我所见过的所有文档都表明自API 1起就可以使用
kurifu

48

图片为空,因为它没有指定的范围。您可以使用,setCompoundDrawables()但在应使用Drawable.setBounds()方法指定图像的边界之前,


1
最佳答案,因为您实际上提供了setBounds为什么重要的推理。
安迪

@Andy确实,最讨厌这些热门答案,而只有800票,它们只是复制粘贴的代码行而没有任何单词
Big_Chair

44

示例设置为顶部:

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

参数顺序:(左,上,右,下)


1
在我的情况下,使用按钮,这应该是可接受的答案。它按预期工作!!!它也向后兼容。
mochadwi

22

再简单一点:

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

10

API 22中不推荐使用。

这段代码对我有用:

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

3

在科特林:

1)设置drawable

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

要么

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2)设置TextView

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

要么

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

对于TextView的setCompoundDrawablesWithIntrinsicBounds将工作..
阿卡什Bisariya


1

Kotlin示例:

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

0

由于未指定边界,因此未显示图像,因此此处有2个选项。

第一种方法

使用setCompoundDrawablesWithIntrinsicBounds方法,如下图

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

第二种方法

您可以在应用到TextView之前将边界应用于可绘制对象,如下所示

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

而已。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.