我有以下LayerDrawable
:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/image_source"
android:bottom="6dp"
android:drawable="@drawable/default"
android:left="14dp"
android:right="14dp"
android:top="6dp">
</item>
<item android:drawable="@drawable/metaphor_photo_portrait"/>
</layer-list>
我需要能够从代码中动态替换@+id/image_source
中的图像。我使用以下方法成功地使用Honeycomb +设备:
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
mLayerDrawable.invalidateSelf();
但是,这不适用于Gingerbread设备,因为setDrawableByLayerId
对于Gingerbread设备(link 1,link 2)不稳定。我建议从头开始构建LayerDrawable
。我开始这样做了,目前我遇到了设置第一层intristicInset
的问题。
我尝试使用
mLayerDrawable.setLayerInset(0, dp14, dp6, dp14, dp6);
dpxx
是常数,我自己计算。然而,似乎这种方法不适用于姜饼(link 1)。
因此我决定尝试另外一种方式 - 设置我在第一层设置的drawable的restangle的边界:
drawable.setBounds(dp14, dp6, dp90 - dp14, dp90 - dp6);
完美,但似乎忽略LayerDrawable
图层上的边界设置(link 1)
现在建议我使用两个图像viwes的组合。不过,我的LayerDrawable
是LevelListDrawable
的一部分,我认为我不能在其中包含布局。
总而言之,这使我无法以任何方式在Honeycomb之前的设备上修改LayerDrawable
的内容。任何关于我应该如何进行的建议都表示赞赏!
答案 0 :(得分:3)
drawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
mLayerDrawable.invalidateSelf();
答案 1 :(得分:0)
最后,我们以一种非常奇怪的方式开始了它:
LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(layerDrawableResourceId);
layerDrawable.setDrawableByLayerId(R.id.image_source, drawable);
Drawable[] layers = {
layerDrawable };
LayerDrawable layerDrawableNew = new LayerDrawable(layers);
我的一位同事发现,如果我们创建新的LayerDrawable
,将非工作方法设置为它,然后将此LayerDrawable
包装在另一个中,则可视化是正确的(图像都被更改)和填充保存)。相当多的调整和很多“不要触摸它的魔力”,但这是我们可以解决的最佳解决方案。