1

好的,我要在这里发疯了。当你尝试了所有东西时,深夜的东西......

我有一个复合 TextView,左边有一个图像。图像(仅显示“正在加载”的小图片)设置为:

Drawable img = getBaseContext().getResources().getDrawable( R.drawable.loading );
img.setBounds( 0, 0, 120, 120 );
tv.setCompoundDrawables( img, null, null, null );

tv 是 TextView 变量。这很好用。但是,稍后我想用新的drawable替换图像,我尝试再次调用 setCompoundDrawables :

tv.setCompoundDrawables( new_img, null, null, null );

我还尝试获取 TextView 的可绘制数组并替换左侧的数组,如下所示:

Drawable[] drw = tv.getCompoundDrawables();
drw[0] = new_img;

代码在调试模式下运行正常。没有异常发生。在 UI 线程中执行的所有 UI 处理。图像似乎还可以,等等,但显示没有改变。我是否必须以某种方式刷新显示?

顺便说一句,如果这很重要,TextView 会添加到垂直 LinearLayout 中。我很确定我在这里遗漏了一些明显的东西,但我看不到它。提前谢谢了。

(是的,我知道我可以用 ImageView 和 vanilla TextView 替换我的设计,但是出于性能原因,如果可能的话,我宁愿坚持使用 Compound TextView)

4

2 回答 2

4

setCompoundDrawables() 无法解码可绘制对象的边界框。
相反,使用TextView::setCompoundDrawablesWithIntrinsicBounds()来使用可绘制对象的隐式边界。这将确保更好地处理不同的屏幕密度。

于 2013-10-27T14:15:43.310 回答
2

好的。我得到了这个工作,但Android似乎对它的工作方式非常挑剔。我发布答案以防它帮助其他人。

这是有效的代码。没什么特别的,直到您阅读下面的评论,显示其他方法不起作用。

// resize the images. these methods seem to be very particular about how the bounds are set
img.setBounds(new Rect(0, 0, 120, 120));    // it likes this
tvp.setCompoundDrawables( img, null, null, null );  // this works for sure when combined with setBounds(Rect)

// what didn't work... (would have to more experimenting with what works and what doesn't)
//img.setBounds( 0, 0, 240, 240 ); // it didn't like this!

//Drawable[] drw = tvp.getCompoundDrawables();
//drw[0] = img;     // it didn't like this technique of assigning a new image

//tvp.setCompoundDrawablesRelativeWithIntrinsicBounds(img, null, null, null);   // no good, as it uses original (intrinsic) size of the image
//tvp.setCompoundDrawablesRelative(img, null, null, null);  // doesn't like this - nothing bad happens; it just doesn't change the image

希望这可以帮助某人。干杯,汤姆

于 2013-07-19T01:36:50.680 回答