8

Bất kỳ ai khác gặp sự cố khi sử dụng ShapeDrawable() mới trong một StateListDrawable trong android 4.2? Tôi sử dụng để làm điều này:Sử dụng mặc định ShapeDrawable trong một StateListDrawable trong Android 4.2

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

Nhưng điều này không có tác dụng nữa trong Android 4.2 , ném một 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) 

Tôi cố định vấn đề này bằng cách thay đổi các nhà xây dựng của ShapeDrawable tôi:

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

Bây giờ này hoạt động tuyệt vời, nhưng tôi muốn biết tại sao điều này không làm việc với các nhà xây dựng mặc định =)

Cảm ơn bạn đã dành thời gian :)

Trả lời

7

các DrawableContainer.selectDrawable() thực hiện đã thay đổi trong Android 4.2 và ShapeDrawable phải sử dụng nhà vệ sinh bằng args.

Nếu bạn sử dụng constructor mặc định, khi gọi mutate()mShapenull, vì vậy mShape.clone() sẽ ném CloneNotSupportedException và trở null. để bạn có được NullPointerException.