3 回答
TA贡献1784条经验 获得超8个赞
可以使用覆盖方法onSaveInstanceState()和onRestoreInstanceState()。或者停止调用onCreate()屏幕旋转,只需在清单xml中添加此行android:configChanges="keyboardHidden|orientation"
注意:您的自定义类必须实现Parcelable以下示例。
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("obj", myClass);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
myClass=savedInstanceState.getParcelable("obj"));
}
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
/** save object in parcel */
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
/** recreate object from parcel */
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
TA贡献1818条经验 获得超8个赞
这里的问题是您正在丢失应用程序的“状态”。在OOP中,什么是状态?变量!究竟!因此,当您丢失变量的数据时。
现在,您可以执行以下操作,找出丢失状态的变量。
旋转设备时,当前活动将被完全破坏,即通过onSaveInstanceState() onPause() onStop() onDestroy() 进行创建,而新创建的活动将通过onCreate() onStart() onRestoreInstanceState完全创建。
粗体的两个方法onSaveInstanceState()保存当前活动的实例,该实例将被销毁。onRestoreInstanceState此方法恢复上一个活动的保存状态。这样,您就不会丢失应用程序的先前状态。
这是您使用这些方法的方式。
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putString("theWord", theWord); // Saving the Variable theWord
outState.putStringArrayList("fiveDefns", fiveDefns); // Saving the ArrayList fiveDefns
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
theWord = savedInstanceState.getString("theWord"); // Restoring theWord
fiveDefns = savedInstanceState.getStringArrayList("fiveDefns"); //Restoring fiveDefns
}
编辑:更好的方法:上述维护数据的方法并不是在生产代码/应用程序中维护数据的最佳方法。Google IO 2017引入了ViewModel以保护您的数据免遭配置更改(例如屏幕旋转)。使用变量将所有数据保留在活动中并不是一个好的软件设计,并且违反了“ 单一职责原则”,因此使用ViewModel与活动分开您的数据存储。
ViewModel将负责显示数据。
活动将负责如何显示数据。
如果存储数据的复杂性越来越高,请使用其他存储库类。
这只是分离类及其职责的一种方法,这在制作结构良好的应用程序时会走很长一段路。
- 3 回答
- 0 关注
- 803 浏览
添加回答
举报