我将尝试解释我的问题:
我所有的片段都在使用 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,它将新的意图分派给具有搜索逻辑的片段。在这里它崩溃了,因为对活动的引用为空