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

8

还有其他人在使用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);

但是在Android4.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());

现在这样做很好,但我想知道为什么使用默认构造函数不起作用 =)。谢谢您的时间 :)
1个回答

7

在Android 4.2中,DrawableContainer.selectDrawable()的实现方式已经改变,ShapeDrawable必须使用带参数的构造函数。

如果你使用默认构造函数,在调用mutate()时,mShape值为null,因此mShape.clone()会抛出CloneNotSupportedException并返回null,导致出现NullPointerException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接