已解决...
我有一个复合视图,其中包含一些其他控件。我试图覆盖保存onSaveInstanceState
和onRestoreInstanceState
,但得到了奇怪的结果。
onRestoreInstanceState
的Parcelable state
参数不是我的自定义子类BaseSavedState
的SavedState
,而且总是BaseSavedState.EMPTY_STATE
。(请查找下面的"always fails"代码注释...)
问题似乎很可能出在保存部分,因为在onSaveInstanceState
进入后没有调用SavedState.writeToParcel
。就好像调用onSaveInstanceState
的人在将结果持久化到Parcel
之前将其丢弃。
如果有区别,这个视图是在一个片段中托管的。
有任何想法吗?
这是我的类定义:
public class AddressInput extends FrameLayout
这是我的onSaveInstanceState
和onRestoreInstanceState
代码:
@Override
protected Parcelable onSaveInstanceState()
{
// Return saved state
Parcelable superState = super.onSaveInstanceState();
return new AddressInput.SavedState( superState, mCurrentLookUp );
}
@Override
protected void onRestoreInstanceState( Parcelable state )
{
// **** (state == BaseSavedState.EMPTY_STATE) is also always true
// Cast state to saved state
if ( state instance of AddressInput.SavedState ) // **** <--- always fails
{
AddressInput.SavedState restoreState = (AddressInput.SavedState)state;
// Call super with its portion
super.onRestoreInstanceState( restoreState.getSuperState() );
// Get current lookup
mCurrentLookUp = restoreState.getCurrentLookup();
}
else
// Just send to super
super.onRestoreInstanceState( state );
}
以下是我定制的BaseSavedState
子类(AddressInput
的内部类):
public static class SavedState extends BaseSavedState
{
private String mCurrentLookup;
public SavedState(Parcelable superState, String currentLookup)
{
super(superState);
mCurrentLookup = currentLookup;
}
private SavedState(Parcel in)
{
super(in);
this.mCurrentLookup = in.readString();
}
public String getCurrentLookup()
{
return mCurrentLookup;
}
@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeString( this.mCurrentLookup );
}
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>()
{
public AddressInput.SavedState createFromParcel(Parcel in)
{
return new AddressInput.SavedState(in);
}
public AddressInput.SavedState[] newArray(int size) {
return new AddressInput.SavedState[size];
}
};
}
onSaveInstanceState
和onRestoreInstanceState
都被调用了,因此视图在片段布局中确实分配了一个id
。 - DaveOddy