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

前端之家收集整理的这篇文章主要介绍了在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相关文章