我认为我在onSaveInstanceState机制中并没有真正理解的东西: 我有一个包含几个数据的类:
public class Site implements Serializable {
private static final long serialVersionUID = 1L;
// used to save device language when the application starts
private String deviceLanguage;
private int deviceWifiState;
private int deviceWifiNetworkId;
private String localeLanguage;
// URLs to access various files to describe site and points of interests
private String wifiSSID = null;
private String wifiWPAKey = null;
private String url = null;
private String flagsDir = "flags/";
private String flagsUrl = null;
private String mediasDir = "medias/";
private String mediasUrl = null;
private String descriptionFileUrl = null;
private FragmentActivity activity;
private ArrayList<Language> listLanguages = null;
private ArrayList<PointOfInterest> listPointsOfInterest = null;
...
// and some getter/setter
}
所以MainActivity
膨胀Fragment_init
开始填充Site类。
主要是ArrayList。
此Fragment_init
不在后台堆栈中。
作业完成后,它会自动提交()一个新的Fragment_selectLanguage
,用户在继续初始化之前设置其语言。
完成后,该线程将被置于后台堆栈中,第三个Fragment_play()将被提交。
所有片段都实现了以下onsaveInstanceState
方法,并将Bundle带回了onViewCreated
方法。
@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
super.onSaveInstanceState(saveInstanceState);
saveInstanceState.putSerializable(FRAGMENT_SELECT_LANGUAGE_SITE, (Serializable) site);
}
在第三个片段中,如果我改变屏幕方向然后返回到前一个片段,当它使用listeLanguages时,我得到一个空指针异常,通常在第一个片段中初始化,这是null。
当我检查Site类时,我发现大多数数据都在里面,但有些数据通常是数组。
我想念什么?我以为整个Site类都已保存了!?
此致
答案 0 :(得分:0)
因为您无法序列化自定义对象。
请参阅此问题以获取具体实施(第二个答案),store and retrieve a class object in shared preference
使用名为Gson的第三方导入https://github.com/pchauhan/StoreandRetrieveObjectClassDemo
答案 1 :(得分:0)
所以实际上我将Site从Serializable改为Parcelable,然后使用:
完美地工作@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
super.onSaveInstanceState(saveInstanceState);
Log.d("2ndGuide", "MainActivity: onSaveInstanceState");
saveInstanceState.putParcelable(MAIN_ACTIVITY_SITE, site);
}
和
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("2ndGuide", "MainActivity: onCreate");
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
site = new Site();
} else {
site = (Site)savedInstanceState.getParcelable(MAIN_ACTIVITY_SITE);
}
}