8

Hat jemand andere Probleme mit einem neuen ShapeDrawable() in einem StateListDrawable in Android 4.2? Früher habe ich dies zu tun:Verwenden Standard ShapeDrawable in einer StateListDrawable in 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); 

Aber das funktioniert nicht mehr in Android 4.2, werfen ein 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) 

ich das Problem behoben, indem Sie den Konstruktor meiner ShapeDrawable Wechsel:

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

Jetzt funktioniert das super, aber ich möchte

Antwort

7

wissen warum diese = mit dem Standard-Konstruktor nicht funktioniert)

Sie :) für Ihre Zeit danken die DrawableContainer.selectDrawable() Realisierung in Android 4.2 geändert hat und der ShapeDrawable muss mit args verwenden zu konstruieren.

Wenn Sie Standardkonstruktors verwenden, wenn mutate() aufrufen mShape ist null, so mShape.clone() CloneNotSupportedException und null zurückkehren werfen. So erhalten Sie eine NullPointerException.

Verwandte Themen