gpt4 book ai didi

Android 在自定义 View 中管理配置更改(状态)

转载 作者:行者123 更新时间:2023-11-30 04:34:07 25 4
gpt4 key购买 nike

这是跟进:Android local variable get's lost when using camera intent

正确的方法是处理 onSaveInstanceStateonRestoreInstanceState,如下所示:
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/CompoundButton.java

这是我的代码:

static class SavedState extends BaseSavedState
{
private String requestedFileName;
private UUID[] mImages = new UUID[4];

SavedState(Parcelable superState)
{
super(superState);
}

private SavedState(Parcel in)
{
super(in);
}

@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
}

//required field that makes Parcelables from a Parcel
public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>()
{
public SavedState createFromParcel(Parcel in)
{
return new SavedState(in);
}
public SavedState[] newArray(int size)
{
return new SavedState[size];
}
};

}

@Override
public Parcelable onSaveInstanceState()
{
//begin boilerplate code that allows parent classes to save state
Parcelable superState = super.onSaveInstanceState();

SavedState ss = new SavedState(superState);
//end

ss.requestedFileName = this.requestedFileName;
ss.mImages = this.mImages;

return ss;
}

@Override
public void onRestoreInstanceState(Parcelable state)
{
//begin boilerplate code so parent classes can restore state
if(!(state instanceof SavedState))
{
super.onRestoreInstanceState(state);
return;
}

SavedState ss = (SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
//end

this.requestedFileName = ss.requestedFileName;
this.mImages = ss.mImages;

RestoreImageState();
}

现在回答我的问题。这段代码似乎可以正常工作,并且可以毫无问题地处理所有状态更改。但是,如果您查看 SavedState.writeToParcelSavedState.SavedState,您会注意到我没有将我的变量存储在那里。我一定要吗?为什么?问题是我了解如何 wrteToParcel 和我的数据类型匹配。但是对于复杂类型,读出包裹不是很清楚。在我的测试中,它没有被调用。

编辑:

保存/检索顺序看起来正确吗?

private SavedState(Parcel in)
{
super(in);
this.mName = in.readString();
this.mIndex = in.readInt();
this.mApplicableDamages = (String[])in.readValue(null);
this.mSelectedDamages = (boolean[])in.readValue(null);
}

@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeString(this.mName);
out.writeInt(this.mIndex);
out.writeArray(this.mApplicableDamages);
out.writeBooleanArray(this.mSelectedDamages);
}

最佳答案

您必须将这些变量保存在 onSaveInstanceState() 中,如果它们是您 View 状态的一部分并且您不希望稍后在 onRestoreInstanceState() 中恢复它们在重新创建父 Activity 时丢失它们。

变量可能会丢失,因为当配置更改发生时,父 Activity 将被销毁并重新创建一个新的 Activity 对象。这个新对象接收先前保存的状态。如果您不向状态添加一些变量,则状态将不会恢复。

关于将复杂类型写入Parcel 和从中读取复杂类型,您可以为复杂类型的某些部分实现Parcelable。或者您可以将复杂类型分解为原始(可分包)字段,然后将这些字段一一存储。在您的情况下,UUID[] 可以作为 Serializable 存储在 Parcel 中,或者您可以将 UUID[] 转换为 ParcelUuid[] 并将此数组存储为可打包数组。

关于 SavedState 实现的几句话。 SavedState 中的字段如果不添加到 Parcel 中将不会被保存。所以你必须在 SavedState.writeToParcel() 方法中写入 Parcel。您还需要在 SavedState(Parcel) 构造函数中读回它们。

static class SavedState extends BaseSavedState
{
private String requestedFileName;
private UUID[] mImages = new UUID[4];

SavedState(Parcelable superState)
{
super(superState);
}

private SavedState(Parcel in)
{
super(in);
requestedFileName = in.readString();
mImages = (UUID[])in.readSerializable();
}

@Override
public void writeToParcel(Parcel out, int flags)
{
super.writeToParcel(out, flags);
out.writeString(requestedFileName);
out.writeSerializable(mImages);
}

//required field that makes Parcelables from a Parcel
public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>()
{
public SavedState createFromParcel(Parcel in)
{
return new SavedState(in);
}

public SavedState[] newArray(int size)
{
return new SavedState[size];
}
};
}

关于Android 在自定义 View 中管理配置更改(状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7182019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com