, Android 1.6 . Android 1.6, :
android.graphics.drawable.StateListDrawable.java:
...
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
final int[][] sets = mStateListState.mStateSets;
final int count = sets.length;
mStateListState.mStateSets = new int[count][];
for (int i = 0; i < count; i++) {
mStateListState.mStateSets[i] = sets[i].clone();
}
mMutated = true;
}
return this;
}
...
mStateListState.mStateSets[i] = sets[i].clone(); //NPE causing line
clone() NullPointerException
Android > 1.6
:
public Drawable mutate() {
if (!mMutated && super.mutate() == this) {
final int[][] sets = mStateListState.mStateSets;
final int count = sets.length;
mStateListState.mStateSets = new int[count][];
for (int i = 0; i < count; i++) {
final int[] set = sets[i];
if (set != null) {
mStateListState.mStateSets[i] = set.clone();
}
}
mMutated = true;
}
return this;
}
Android 1.6 . , mStateSets [i] :
android.graphics.drawable.DrawableContainer.DrowableContainerState:
...
public final int addChild(Drawable dr) {
final int pos = mNumChildren;
if (pos >= mDrawables.length) {
growArray(pos, pos+10);
}
dr.setVisible(false, true);
dr.setCallback(mOwner);
mDrawables[pos] = dr;
mNumChildren++;
mChildrenChangingConfigurations |= dr.getChangingConfigurations();
mHaveOpacity = false;
mHaveStateful = false;
mConstantPadding = null;
mPaddingChecked = false;
mComputedConstantSize = false;
return pos;
}
...
xml. , mStateListState.mStateSets N * 10.
list_selector_background.xml, , android.R.drawable.list_selector_background:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false"
android:drawable="@color/transparent" />
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/list_selector_background_focus" />
</selector>
6 !
, ?
1. list_selector_background.xml {Project}/res/drowable/ Android one :
<item android:state_window_focused="false"
android:drawable="@color/transparent" />
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
Android :
list_selector_background_disabled.9.png
list_selector_background_focus.9.png
list_selector_background_longpress.9.png
list_selector_background_pressed.9.png
list_selector_background_transition.xml
list_selector_background.xml, , (6 + 4 = 10):
<item android:animationCache="true"
android:drawable="@android:color/transparent" />
<item android:animationCache="false"
android:drawable="@android:color/transparent" />
<item android:alwaysDrawnWithCache="false"
android:drawable="@android:color/transparent" />
<item android:alwaysDrawnWithCache="true"
android:drawable="@android:color/transparent" />
. . .