Android LayerDrawable.SetDrawableByYerId不适用于HTC Sensation(和其他?)

Android LayerDrawable.SetDrawableByYerId不适用于HTC Sensation(和其他?),android,drawable,Android,Drawable,我正在使用LayerDrawable在底层图像(索引0)上建立一系列热点(索引1+)。热点是基于用户界面交互添加的,它们的位置是动态的,所以我通过编程而不是使用XML来完成所有这些。作为进一步(可能不相关)的细节,我使用片段来保存LayerDrawable,因为这是在FragmentStatePagerAdapter和ViewPager的上下文中 问题是,当我试图通过更改LayerDrawable中的Drawable来更新图像时,调用setDrawableByLayerId的Drawable不会

我正在使用LayerDrawable在底层图像(索引0)上建立一系列热点(索引1+)。热点是基于用户界面交互添加的,它们的位置是动态的,所以我通过编程而不是使用XML来完成所有这些。作为进一步(可能不相关)的细节,我使用片段来保存LayerDrawable,因为这是在FragmentStatePagerAdapter和ViewPager的上下文中

问题是,当我试图通过更改LayerDrawable中的Drawable来更新图像时,调用setDrawableByLayerId的Drawable不会更改图像(尽管该方法返回true,表明它找到了该层)


我怎样才能让它工作呢?

在这里回答我自己的问题,希望它对其他人有用。我唯一能让它在我的HTC感觉上发挥作用的方法是从头开始重新创建LayerDrawable,再加上以下更改:

LayerDrawable oldLayerDrawable = (LayerDrawable) imageView.getDrawable();
Drawable[] layers = new Drawable[2];
layers[0] = oldLayerDrawable.getDrawable(0);
layers[1] = getResources().getDrawable(R.drawable.hotspot_dot);
LayerDrawable layerDrawable = new LayerDrawable(layers);
imageView.setImageDrawable(layerDrawable);
这并不漂亮,但似乎这可能是一个已知的问题

newdrawable.setBounds(mLayerDrawable.findDrawableByLayerId(R.id.image_source).getBounds());
        mLayerDrawable.setDrawableByLayerId(R.id.image_source, drawable);        
        mLayerDrawable.invalidateSelf();
参考: 问题是“索引”和“id”是不同的属性。 默认情况下,任何层的layerId始终等于-1。但是您可以通过调用
setId(index,id)
,然后调用
setDrawableByLayerId(id,Drawable)