在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()); 

现在, 这个工程很好 ,但我想知道为什么这不适用于默认的构造函数 =)

感谢您的时间 :)

Related of "在Android 4.2的StateListDrawable中使用默认的ShapeDrawable"

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

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