Java 即使使用setRetainInstance(true),oncreate中的片段也始终为null
我想让一些数据持久化,并按照开发人员指南创建了一个数据片段类,以保存所有数据 在onCreate中,我使用以下逻辑来确定数据片段是否为null,这在《开发人员指南》中也有描述:Java 即使使用setRetainInstance(true),oncreate中的片段也始终为null,java,android,android-fragments,android-studio,Java,Android,Android Fragments,Android Studio,我想让一些数据持久化,并按照开发人员指南创建了一个数据片段类,以保存所有数据 在onCreate中,我使用以下逻辑来确定数据片段是否为null,这在《开发人员指南》中也有描述: find the retained fragment on activity restarts FragmentManager fm = getFragmentManager(); dataFragment = (DataFragment) fm.findFragmentByTag(“data”);
find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (dataFragment == null) {
// add the fragment
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, “data”).commit();
// load the data from the web
dataFragment.setData(loadMyData());
} else {
//loading data from dataRestoreFragment
}
super.onCreate(savedInstanceState);
但是dataFrag总是空的,即使在方向改变之后!
这里怎么了
编辑:
数据片段代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
我必须提到,如果我在super.onCreatesavedInstanceState之后检查datafrag;它将工作并返回正确的片段,但问题是,我的另一个片段是ListFragment,它的适配器将在恢复数据之前被调用,因此我无法将数据加载到该片段中,该片段将没有数据并导致应用程序崩溃!
如果将代码放在super.onCreatesavedInstanceState之前,它将在Listfragment适配器之前执行,但它是空的
那么我该如何解决这个问题呢?尝试添加类似的内容
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dataFragment.setData(collectMyLoadedData());
}
如果我在super.onCreatesavedInstanceState之后检查datafrag;它将工作并返回正确的片段
那就这样做吧
我的另一个片段是ListFragment,它的适配器将在恢复数据之前被调用,因此我无法将数据加载到该片段中,该片段将没有数据并导致应用程序崩溃
那么您的get called逻辑在该片段中的方法是错误的。您需要在片段生命周期的后期移动该逻辑,例如onViewCreated或onActivityCreated。查看您是否启用了设备或模拟器上的“设置”>“开发人员选项”中的“不保留活动”。否,未选中@commonsware何时调用此方法?在奥德斯特罗之前?我已经在onDestroy中保存了数据,但在super.onCreate之前,activity的onCreate方法中的fragment为null。该方法处理方向更改。我最终将所有的fragment设置为setRetainInstancetrue,现在我也可以在横向模式下使用该应用程序,但我无法仅使用一个frag来处理数据