2

我将尝试解释我的问题:

我所有的片段都在使用 setRetainInstance(true) 在我的活动 onCreate 我这样做:

    if (savedInstanceState == null) {
        fragment = onCreatePane();
        fragment.setArguments(intentToFragmentArguments(getIntent()));

        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.add(R.id.root_container, fragment, getFragmentTag());
        trans.commit();
    } else {
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        if ( fragment == null ) {

            fragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag());
        }

        if (fragment == null) {
            fragment = onCreatePane();
            fragment.setArguments(intentToFragmentArguments(getIntent()));
        }           

        trans.add(R.id.root_container, fragment, getFragmentTag());
        trans.commit();

    }

因此,当我创建活动并且 savedInstance 为空时,我创建了 Fragment,设置了它的参数,我开始事务并将我的 Fragment 添加到事务中,并使用它自己的标签(稍后将其取回)。

用户与活动交互并改变方向。活动被销毁并重新创建(作为正常活动生命周期)。所以现在它进入else,片段为空,我做一个fragment = getSupportFragmentManager().findFragmentByTag(getFragmentTag());返回片段管理器持有的正确片段。

问题是这个片段包含对已被破坏的旧 Activity 的引用,所以如果我执行 fragment.getActivity 它返回 null。如何将片段引用更新为新的重新创建的 Activity?

更新:更准确地说,我在 SearchActivity 上,它在获得新搜索时调用 onNewIntent。所以实际的交互是这样->用户进行搜索->搜索正确显示->用户改变方向,结果显示正确(如果用户与结果交互,他们很好)->用户从搜索按钮进行新搜索,然后这调用了 SearchActivity 的 onNewIntent,它将新的意图分派给具有搜索逻辑的片段。在这里它崩溃了,因为对活动的引用为空

4

4 回答 4

1

你何时何地打电话getActivity()?活动参考确实会自动更新,但不会立即更新。onActivityCreated()在被调用后,您应该可以安全地访问它。

于 2012-06-13T11:01:42.117 回答
0

只需从其他部分删除空检查 if ( fragment == null ) { fragment = getSupportFragmentManager(......让更新片段与在方向改变时创建的新片段......

于 2012-06-13T11:05:53.557 回答
0

如果 setRetainInstance(true) - 是的,这就是解决方案(按标签查找片段,因为再次实例化它 - 是错误的方式 - 可能正在进行后台例程)。否则,如果您设置了 setRetainInstance(false),问题可能会再次出现。我也有类似的。我是我的情况——因为我使用了 Loader(在后台)。解决方案很简单:在片段的 onDestroy() 方法中销毁片段的加载器。

于 2012-10-16T08:28:33.343 回答
0

在您的 baseAcvivity 中,您可以覆盖 onSaveInstanceStat 来解决此问题:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //solution of fragment.getActivity() is null
    outState.remove("android:support:fragments");
}
于 2016-07-19T04:25:10.193 回答