【问题标题】:Fragment is always null in oncreate even with setRetainInstance(true)即使使用 setRetainInstance(true),oncreate 中的片段也始终为空
【发布时间】:2014-10-12 16:22:02
【问题描述】:

我想让一些数据持久化,我按照开发者指南Here 创建了一个数据片段类来保存我的所有数据。

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

 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 始终为 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 !

那么我该如何解决这个问题?

【问题讨论】:

  • 查看您是否在设备或模拟器上的“设置”>“开发者选项”中启用了“不保留活动”。
  • 不,没有检查@CommonsWare

标签: java android android-fragments android-studio


【解决方案1】:

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

那就这样做吧。

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

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

【讨论】:

  • 我最终将所有片段设置为 setRetainInstance(true),现在我也可以在横向模式下使用该应用程序,但我不能只使用一个片段作为数据
【解决方案2】:

尝试添加类似的内容;

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

【讨论】:

  • 什么时候调用这个方法?在 onDestroy 之前?我已将数据保存在 onDestroy 中,但在 super.onCreate 之前,活动的 onCreate 方法中的片段为空
  • 这个方法处理方向变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多