android 保存界面设置,Android中保存界面状态

场景:一个Tab中的一个子Activty里有listView

a.如果在此Activty中启动其他应用,当返回时系统为我门保存了当前状态(应该也是调用了以下方法来保存)。

b.如果是在其他子Activty中启动其他应用,当返回时ListView滑动状态就会丢失。

View类有一个继承自AbsSavedState的BaseSavedState类,所有View的子类都会继承这个BaseSavedState类。当然包括ListView,TextView等等。以下代码即可实现场景b中保存ListView滑动状态:

1.写出以下方法

[java] view plaincopyprint?

/**

* Used to keep track of the scroll state of the list.

*/

private Parcelable mListState = null;

private static final String LIST_STATE_KEY = "liststate";

@Override

protected void onSaveInstanceState(Bundle icicle) {

super.onSaveInstanceState(icicle);

// Save list state in the bundle so we can restore it after the QueryHandler has run

if (mList != null) {

icicle.putParcelable(LIST_STATE_KEY, mList.onSaveInstanceState());

}

}

@Override

protected void onRestoreInstanceState(Bundle icicle) {

super.onRestoreInstanceState(icicle);

// Retrieve list state. This will be applied after the QueryHandler has run

mListState = icicle.getParcelable(LIST_STATE_KEY);

}

2.在合适的地方调用(比如onCreate):

if(mListState!=null){

mList.onRestoreInstanceState(mListState);

mListState = null;

}

在ListView中SavedState继承自

BaseSavedState

ListView中的实现如下

static class SavedState extends BaseSavedState {

SparseBooleanArray checkState;

LongSparseArray checkIdState;

/**

* Constructor called from {@link ListView#onSaveInstanceState()}

*/

SavedState(Parcelable superState, SparseBooleanArray checkState,

LongSparseArray checkIdState) {

super(superState);

this.checkState = checkState;

this.checkIdState = checkIdState;

}

/**

* Constructor called from {@link #CREATOR}

*/

private SavedState(Parcel in) {

super(in);

checkState = in.readSparseBooleanArray();

long[] idState = in.createLongArray();

if (idState.length > 0) {

checkIdState = new LongSparseArray();

checkIdState.setValues(idState, Boolean.TRUE);

}

}

@Override

public void writeToParcel(Parcel out, int flags) {

super.writeToParcel(out, flags);

out.writeSparseBooleanArray(checkState);

out.writeLongArray(checkIdState != null ? checkIdState.getKeys() : new long[0]);

}

@Override

public String toString() {

return "ListView.SavedState{"

+ Integer.toHexString(System.identityHashCode(this))

+ " checkState=" + checkState + "}";

}

public static final Parcelable.Creator CREATOR

= new Parcelable.Creator() {

public SavedState createFromParcel(Parcel in) {

return new SavedState(in);

}

public SavedState[] newArray(int size) {

return new SavedState[size];

}

};

}

//以下实现状态的保存和回复

@Override

public Parcelable onSaveInstanceState() {

Parcelable superState = super.onSaveInstanceState();

return new SavedState(superState, mCheckStates, mCheckedIdStates);

}

@Override

public void onRestoreInstanceState(Parcelable state) {

SavedState ss = (SavedState) state;

super.onRestoreInstanceState(ss.getSuperState());

if (ss.checkState != null) {

mCheckStates = ss.checkState;

}

if (ss.checkIdState != null) {

mCheckedIdStates = ss.checkIdState;

}

}

View中,BaseSaveState的实现如下

/**

* Base class for derived classes that want to save and restore their own

* state in {@link android.view.View#onSaveInstanceState()}.

*/

public static class BaseSavedState extends AbsSavedState {

/**

* Constructor used when reading from a parcel. Reads the state of the superclass.

*

* @param source

*/

public BaseSavedState(Parcel source) {

super(source);

}

/**

* Constructor called by derived classes when creating their SavedState objects

*

* @param superState The state of the superclass of this view

*/

public BaseSavedState(Parcelable superState) {

super(superState);

}

public static final Parcelable.Creator CREATOR =

new Parcelable.Creator() {

public BaseSavedState createFromParcel(Parcel in) {

return new BaseSavedState(in);

}

public BaseSavedState[] newArray(int size) {

return new BaseSavedState[size];

}

};

}

AbsSavedState类实现了Parcelable接口,具体实现如下:

public abstract class AbsSavedState implements Parcelable {

public static final AbsSavedState EMPTY_STATE = new AbsSavedState() {};

private final Parcelable mSuperState;

/**

* Constructor used to make the EMPTY_STATE singleton

*/

private AbsSavedState() {

mSuperState = null;

}

/**

* Constructor called by derived classes when creating their SavedState objects

*

* @param superState The state of the superclass of this view

*/

protected AbsSavedState(Parcelable superState) {

if (superState == null) {

throw new IllegalArgumentException("superState must not be null");

}

mSuperState = superState != EMPTY_STATE ? superState : null;

}

/**

* Constructor used when reading from a parcel. Reads the state of the superclass.

*

* @param source

*/

protected AbsSavedState(Parcel source) {

// FIXME need class loader

Parcelable superState = source.readParcelable(null);

mSuperState = superState != null ? superState : EMPTY_STATE;

}

final public Parcelable getSuperState() {

return mSuperState;

}

public int describeContents() {

return 0;

}

public void writeToParcel(Parcel dest, int flags) {

dest.writeParcelable(mSuperState, flags);

}

public static final Parcelable.Creator CREATOR

= new Parcelable.Creator() {

public AbsSavedState createFromParcel(Parcel in) {

Parcelable superState = in.readParcelable(null);

if (superState != null) {

throw new IllegalStateException("superState must be null");

}

return EMPTY_STATE;

}

public AbsSavedState[] newArray(int size) {

return new AbsSavedState[size];

}

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值