gpt4 book ai didi

android - 使用 View.BaseSavedState 覆盖 View.onSaveInstanceState() 和 View.onRestoreInstanceState()?

转载 作者:可可西里 更新时间:2023-11-01 18:44:53 25 4
gpt4 key购买 nike

假设您想从现有的 View 实现派生自己的 View 类,添加一些值,从而维护一些变量,这些变量以有意义的方式表示您的 View 的状态。

如果您的 View 能像其他 View 一样自动保存其状态(如果分配了 ID),那就太好了,所以您会想要覆盖 onRestoreInstanceState()onSaveInstanceState().

当然,你需要调用你的基类各自的方法,你需要结合你的状态信息和你的基类。

显然,唯一安全的方法是将父类(super class)的 Parcelable 包装在自己的 Parcelable 中,这样 key 就不会混淆。

现在有 View.BaseSavedState及其有趣的 getSuperState() 方法,但我不知何故无法理解这如何真正增加了将基类的 Parcelable 存储在 Bundle 中的值(value)连同派生的 View 的状态值并返回它。另一方面,也许其他一些系统组件会期望所有 InstanceState 信息都是 View.AbsSavedState 类型(例如,这样可以调用 getSuperState())?

有什么经验可以分享吗?

最佳答案

为了补充 James Chen 的回答,here是如何使用此方法的完整示例,基于博客 article查尔斯·哈利 (Charles Harley) 着。

链接中的代码:

public class LockCombinationPicker extends LinearLayout {
private NumberPicker numberPicker1;
private NumberPicker numberPicker2;
private NumberPicker numberPicker3;

public LockCombinationPicker(Context context) {
this(context, null);
}

public LockCombinationPicker(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public LockCombinationPicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
loadViews();
}

private void loadViews() {
LayoutInflater.from(getContext()).inflate(R.layout.lock_combination_picker, this, true);
numberPicker1 = (NumberPicker) findViewById(R.id.number1);
numberPicker1.setMinValue(0);
numberPicker1.setMaxValue(10);
numberPicker2 = (NumberPicker) findViewById(R.id.number2);
numberPicker2.setMinValue(0);
numberPicker2.setMaxValue(10);
numberPicker3 = (NumberPicker) findViewById(R.id.number3);
numberPicker3.setMinValue(0);
numberPicker3.setMaxValue(10);
}

@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
return new SavedState(superState, numberPicker1.getValue(), numberPicker2.getValue(), numberPicker3.getValue());
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState savedState = (SavedState) state;
super.onRestoreInstanceState(savedState.getSuperState());
numberPicker1.setValue(savedState.getNumber1());
numberPicker2.setValue(savedState.getNumber2());
numberPicker3.setValue(savedState.getNumber3());
}

@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
// As we save our own instance state, ensure our children don't save and restore their state as well.
super.dispatchFreezeSelfOnly(container);
}

@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
/** See comment in {@link #dispatchSaveInstanceState(android.util.SparseArray)} */
super.dispatchThawSelfOnly(container);
}

/**
* Convenience class to save / restore the lock combination picker state. Looks clumsy but once created is easy to maintain and use.
*/
protected static class SavedState extends BaseSavedState {
private final int number1;
private final int number2;
private final int number3;

private SavedState(Parcelable superState, int number1, int number2, int number3) {
super(superState);
this.number1 = number1;
this.number2 = number2;
this.number3 = number3;
}

private SavedState(Parcel in) {
super(in);
number1 = in.readInt();
number2 = in.readInt();
number3 = in.readInt();
}

public int getNumber1() {
return number1;
}

public int getNumber2() {
return number2;
}

public int getNumber3() {
return number3;
}

@Override
public void writeToParcel(Parcel destination, int flags) {
super.writeToParcel(destination, flags);
destination.writeInt(number1);
destination.writeInt(number2);
destination.writeInt(number3);
}

public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}

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

关于android - 使用 View.BaseSavedState 覆盖 View.onSaveInstanceState() 和 View.onRestoreInstanceState()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14891434/

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