在Android 4.2中的StateListDrawable中使用默认的ShapeDrawable

其他人在 android 4.2中的StateListDrawable中使用新的ShapeDrawable()时遇到问题?我曾经这样做过:
ShapeDrawable bg = new ShapeDrawable();    //default Ctor
ShapeDrawable hl = new ShapeDrawable();
hl.getPaint().setColor(color1);
bg.getPaint().setColor(color2);

StateListDrawable s1 = new StateListDrawable();
s1.addState(new int[]{android.R.attr.state_pressed},hl);
s1.addState(new int[]{},bg);

但是这在Android 4.2中不再起作用了,抛出了nullpointerexception:

java.lang.NullPointerException
at android.graphics.drawable.ShapeDrawable.mutate(ShapeDrawable.java:387)
at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:315)
at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:106)
at android.graphics.drawable.StateListDrawable.addState(StateListDrawable.java:89)

我通过更改ShapeDrawable的构造函数来修复此问题:

ShapeDrawable bg = new ShapeDrawable(new RectShape());
ShapeDrawable hl = new ShapeDrawable(new RectShape());

在这很好用,但我想知道为什么这对认构造函数不起作用=)

感谢您的时间 :)

解决方法

DrawableContainer.selectDrawable()实现在Android 4.2中已更改,ShapeDrawable必须使用带有args的构造.

如果使用认构造函数,则在调用mutate()时mShape为null,因此mShape.clone()将抛出CloneNotSupportedException并返回null.所以你得到一个NullPointerException.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...