Android getDrawable返回ColorDrawable而不是BitmapDrawable

在Android 2.3.x上面,遇到了一个问题,那就是通过Application Context得到Resources,然后再调用getDrawable(int),得到的是一个ColorDrawable,而不是BitmapDrawable,但是这个id所对应的资源的确是一张图片。


1,问题背景

 实现代码是这样的:

Drawable drawable = CustomApplication.getAppContext().getResources()
.getDrawable(R.drawable.aozora_background);

上面的代码,是没有问题的,通过Resources.getDrawable(int)来得到一个Drawable,但id所对应的资源是png,但得到的却是ColorDrawable,而且有时是ColorDrawable,有时是BitmapDrawable,问题是相当的奇怪。

运行平台是Android 2.3.x


2,原因

关于这个问题的原因,真是调查了半天,最后终于解决,真是费劲呀。

这个问题在Android 4.0.x(ICS)上面是没有问题的,我对比过2.3和4.0的Resources类,4.0的Resources比2.3的Resources在同一个方法,修正了不少,所以我慢慢觉得这很可能是Android 2.3.x的BUG,但怎么证明这一点?

我调查了很多,终于在一个外国论坛上找到了一句很核心的话

"There is a bug in the Android System that will sometimes load the first asset in the R.java as a ColorDrawable instead of a BitmapDrawable."

他说Android的2.3上面有一个BUG,有时候加载第一个资源的时候会返回ColorDrawable,而不是BitmapDrawable。

刚开始我也不理解这话的意思,但我最后突然明白,第一个资源,不知道是你否注意到资源id是R.drawable.aozora_background,正好,它在我们的程序中是第一个,我最后,查看了R.drawable类,它的确是排在第一个,第二个是app_icon。这正好应正了上面那句话。

所以,原因就是:资源id是排列在R.drawable中的第一个,也就是说,如果这个资源,是R.drawable中的第一个成员,那么就可能出现这种情况。


3,解决办法

知道原因了,就好办了,我们把资源名称改了一下,让它不要排在第一个,然后重新clean,再编译,问题就解决了。

其实,Android 2.3.x的Bug还是很多的。而且这些BUG都是很难重现,它们一般都会在高版本的系统中修正,比如说这个BUG,在4.0.x上面就不出现,说实话,这种问题真的是很无奈,因为本来看不是问题的问题,结果要搞半天,最终才发现,帮助Android发现BUG了。

所以,以后图片资源,尽量不要让他排在第一个,系统他本身会新建一个app_icon的资源,这点以后在开发的过程中需要注意。






你可能感兴趣的:(android,drawable)