我知道这个问题非常普遍,我已经阅读了很多不同的答案,但没有一个适合我的问题。在我的应用程序中,我有一个活动,在rhye活动中我加载了一个片段。我还将一些数据(以Bundle的形式)发送到片段。所以我的问题是当屏幕旋转时,我将片段保存在onSaveInstanceState
Activity方法中并检查onCreate方法weather weatherInstance是否为null,并在此基础上加载片段。
活动代码:
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
outState.putParcelable(Const.TAG_REQ_CUSTOM,DetailsItems);
outState.putString(Const.TAG_FLOW, Const.TAG_MAIN_FLOW);
getSupportFragmentManager().putFragment(outState,"current_fragment",fragment);
}
onCreate方法:
if (findViewById(R.id.fragment_frame) != null) {
if (savedInstanceState != null) {
// this invoke when screen rotate but the app crash
DetailsItems = savedInstanceState.getParcelable(Const.TAG_REQ_CUSTOM);
String flow = savedInstanceState.getString(Const.TAG_FLOW);
ft = getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment");
mFragmentManager=getSupportFragmentManager();
mFragmentTransaction = mFragmentManager.beginTransaction();
bundle= new Bundle();
bundle.putString(Const.TAG_FLOW, flow);
bundle.putParcelable(Const.TAG_REQ_BOOKING_DETAILS, bookingDetailsItems);
ft.setArguments(bundle);
mFragmentTransaction.replace(R.id.fragment_frame, ft).commit();
}else{
// load fragment on first time
}
}
所以我的问题是:我在哪里保存自定义对象(在父Activity或片段中)? 当我保存的Instance不是app而不是app crashesh且logs是:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
答案 0 :(得分:0)
查看onRetainNonConfigurationInstance()
和getLastNonConfigurationInstance()
来自docs:
由系统调用,作为因配置更改而销毁活动的一部分,当知道将立即为新配置创建新实例时。您可以在此处返回您喜欢的任何对象,包括活动实例本身,稍后可以通过在新活动实例中调用 getLastNonConfigurationInstance()来检索该对象。
答案 1 :(得分:0)
在Activity中使用此代码:
if (findViewById(R.id.fragment_frame) != null) {
if (savedInstanceState != null) {
fragment =getSupportFragmentManager().getFragment(savedInstanceState,"current_fragment");
}else{
// load fragment on first time
}
}
并在片段中:
//save custom object
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putParcelable("key",customObject);
}
//now retrieve here
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null)
customObject= savedInstanceState.getParcelable("key");
}
答案 2 :(得分:0)
您应该使用ViewModel
。 ViewModel
专门用于此目的。
来自文档:
ViewModel是一个负责准备和管理活动或片段数据的类。它还处理Activity / Fragment与应用程序其余部分的通信(例如,调用业务逻辑类)。