即使使用setRetainInstance(true),oncreate中的片段也始终为null

时间:2014-10-12 16:22:02

标签: java android android-fragments android-studio

我想要保留一些数据,并且我遵循开发人员指南Here并创建了一个数据片段类,以保存我的所有数据。

在onCreate中我使用以下逻辑来确定Data Fragment是否为null(在开发人员指南中也有描述):

 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);

但是,即使更改了oriention,dataFrag仍然是NULL! 这有什么不对?

编辑:

数据碎片代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // retain this fragment
    setRetainInstance(true);
}

我必须提一下,如果我在super.onCreate(savedInstanceState)之后检查datafrag;它会工作并返回正确的片段,但问题是,我的另一个片段是ListFragment,它的适配器将在恢复数据之前被调用,这样我就无法将数据加载到该片段中,并且片段将没有数据和原因崩溃的应用程序! 如果将代码放在super.onCreate(savedInstanceState)之前,它将在Listfragment适配器之前执行,但它为null!

所以我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

  

如果我在super.onCreate(savedInstanceState)之后检查datafrag;它会工作并返回正确的片段

然后这样做。

  

我的另一个片段是ListFragment,它的适配器将在恢复数据之前被调用,因此我无法将数据加载到该片段中,并且该片段将没有数据并导致应用程序崩溃!

然后你的“被调用”逻辑在该片段中的方法是错误的。您需要稍后在片段的生命周期中移动该逻辑,例如onViewCreated()onActivityCreated()

答案 1 :(得分:-1)

尝试添加类似的内容;

@Override
public void onConfigurationChanged(Configuration newConfig) {
   super.onConfigurationChanged(newConfig);
   dataFragment.setData(collectMyLoadedData());
}