在Android 2.3.x上面,遇到了一个问题,那就是通过Application Context得到Resources,然后再调用getDrawable(int),得到的是一个ColorDrawable,而不是BitmapDrawable,但是这个id所对应的资源的确是一张图片。
实现代码是这样的:
Drawable drawable = CustomApplication.getAppContext().getResources() .getDrawable(R.drawable.aozora_background);
运行平台是Android 2.3.x。
关于这个问题的原因,真是调查了半天,最后终于解决,真是费劲呀。
这个问题在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中的第一个成员,那么就可能出现这种情况。
知道原因了,就好办了,我们把资源名称改了一下,让它不要排在第一个,然后重新clean,再编译,问题就解决了。
其实,Android 2.3.x的Bug还是很多的。而且这些BUG都是很难重现,它们一般都会在高版本的系统中修正,比如说这个BUG,在4.0.x上面就不出现,说实话,这种问题真的是很无奈,因为本来看不是问题的问题,结果要搞半天,最终才发现,帮助Android发现BUG了。
所以,以后图片资源,尽量不要让他排在第一个,系统他本身会新建一个app_icon的资源,这点以后在开发的过程中需要注意。