Dav*_*ddy 3 android state custom-view android-custom-view onrestoreinstancestate
解决了...
我有一个包含一些其他控件的复合视图.我想重写保存onSaveInstanceState和onRestoreInstanceState,但我得到一个奇怪的结果.
该Parcelable state给的说法onRestoreInstanceState是不是我的自定义子类的BaseSavedState,SavedState并且似乎总是BaseSavedState.EMPTY_STATE.(在下面查找"总是失败"的代码注释...
看起来这个问题很可能出现在保存部分,因为 几乎SavedState.writeToParcel没有被调用之后onSaveInstanceState enters.几乎就好像正在调用的人onSaveInstanceState在将结果持久化之前抛弃结果Parcel.
如果它有所不同,则此视图托管在片段中.
有任何想法吗?
这是我的班级定义:
public class AddressInput extends FrameLayout
Run Code Online (Sandbox Code Playgroud)
这是我的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 );
}
Run Code Online (Sandbox Code Playgroud)
这是我的自定义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];
}
};
}
Run Code Online (Sandbox Code Playgroud)
想出来......我的自定义视图与用于FrameLayout自定义视图的特定实例的ID具有相同的ID .实例正确保存了状态,然后由FrameLayout没有状态的状态覆盖(清除)状态.
我还将其基类更改为RelativeView更有意义的基类.
在自定义视图的XML中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:id="@+id/addressInput"
android:background="@drawable/rounded_edit">
Run Code Online (Sandbox Code Playgroud)
和实例用法:
<com.myStuff.AddressInput
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/addressInput"
android:layout_marginTop="10dp"
app:addressMode="Domestic"
app:showSelect="true"
app:showClear="true" />
Run Code Online (Sandbox Code Playgroud)
更改为:(@ + id/addressInput - > @ + id/shippingAddress)
<com.myStuff.AddressInput
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/shippingAddress"
android:layout_marginTop="10dp"
app:addressMode="Domestic"
app:showSelect="true"
app:showClear="true" />
Run Code Online (Sandbox Code Playgroud)
让你希望有一些范围确定ID来防止这种事情.为什么您必须了解自定义视图的内部结构以确保避免ID冲突?
| 归档时间: |
|
| 查看次数: |
4181 次 |
| 最近记录: |