解决了...
我有一个包含一些其他控件的复合视图.我想重写保存onSaveInstanceState
和onRestoreInstanceState
,但我得到一个奇怪的结果.
该Parcelable state
给的说法onRestoreInstanceState
是不是我的自定义子类的BaseSavedState
,SavedState
并且似乎总是BaseSavedState.EMPTY_STATE
.(在下面查找"总是失败"的代码注释...
看起来这个问题很可能出现在保存部分,因为 几乎SavedState.writeToParcel
没有被调用之后onSaveInstanceState enters.
几乎就好像正在调用的人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.CreatorCREATOR = new Parcelable.Creator () { public AddressInput.SavedState createFromParcel(Parcel in) { return new AddressInput.SavedState(in); } public AddressInput.SavedState[] newArray(int size) { return new AddressInput.SavedState[size]; } }; }
DaveOddy.. 6
想出来......我的自定义视图与用于FrameLayout
自定义视图的特定实例的ID具有相同的ID .实例正确保存了状态,然后由FrameLayout
没有状态的状态覆盖(清除)状态.
我还将其基类更改为RelativeView
更有意义的基类.
在自定义视图的XML中:
和实例用法:
更改为:(@ + id/addressInput - > @ + id/shippingAddress)
让你希望有一些范围确定ID来防止这种事情.为什么您必须了解自定义视图的内部结构以确保避免ID冲突?
想出来......我的自定义视图与用于FrameLayout
自定义视图的特定实例的ID具有相同的ID .实例正确保存了状态,然后由FrameLayout
没有状态的状态覆盖(清除)状态.
我还将其基类更改为RelativeView
更有意义的基类.
在自定义视图的XML中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_ android:layout_ android:padding="10dp" android:id="@+id/addressInput" android:background="@drawable/rounded_edit">
和实例用法:
<com.myStuff.AddressInput android:layout_ android:layout_ android:id="@+id/addressInput" android:layout_marginTop="10dp" app:addressMode="Domestic" app:showSelect="true" app:showClear="true" />
更改为:(@ + id/addressInput - > @ + id/shippingAddress)
<com.myStuff.AddressInput android:layout_ android:layout_ android:id="@+id/shippingAddress" android:layout_marginTop="10dp" app:addressMode="Domestic" app:showSelect="true" app:showClear="true" />
让你希望有一些范围确定ID来防止这种事情.为什么您必须了解自定义视图的内部结构以确保避免ID冲突?