我有一个非常大的问题,我不太了解发生了什么。我正在开发一个使用Fragments(来自支持库)的应用程序,并使用FragmentTransaction.replace()
将新碎片放到后端堆栈上并替换旧堆栈。代码如下:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
这是成功替换我的片段。我的问题如下。在一个片段中,我有一个根据用户输入构建的项目列表。现在,当用户单击下一步然后单击后退按钮(返回列表)时,列表为空,因为视图已被销毁。现在,我注意到以下内容:
所以,我想我的主要问题是:在使用replace
时,有没有办法保留视图状态(只是保留片段)?有FragmentTransaction.add()
,但也存在一些问题。一个是没有执行退出动画,因此动画不正确。另一个是旧片段(即处于不可见状态的片段)仍然是可点击的新片段。例如,如果我有一个ListFragment,并且我使用add将内容片段放在其上,我仍然可以单击ListFragment中的列表项。
答案 0 :(得分:2)
无法看到您的片段的代码,这是一个猜测,但在过去我遇到了同样的问题,我发现在ListFragment
中重置了适配器onViewStateRestored
似乎可以解决问题。
public void onViewStateRestored (Bundle savedInstanceState)
{
super.onViewStateRestored (savedInstanceState);
setListAdapter(new ArrayAdapter(Activity, R.layout.nav_item, objects));
}
考虑到文档声明此方法在onActivityCreated
之后但在onStart
之前调用,这是奇怪的。但似乎在其他时候也会调用它,因为当最后一个片段事务从后栈中弹出时,在显示先前替换的片段之前调用此方法。拥有这些片段的活动没有以任何方式暂停或模糊,因此根据文档onViewStateRestored
不应该被调用,因为只是修改了片段。但无论如何这似乎都有效。
答案 1 :(得分:2)
听起来您只需要确保已正确实现onCreateView和onDestroyView。您描述的情况似乎表明,当列表片段放在后台堆栈上时(作为替换事务的结果),Android正在调用onDestroyView以释放一些资源。但是,它显然没有销毁列表片段,因为当您点击时,您将返回相同的片段实例。
假设这一切都是真的那么,当用户点击后Android会调用onCreateView。您存储在片段的实例变量中的任何状态应该仍然存在,您需要做的就是重新填充视图...可能在ListView上设置适配器或其他任何东西。
还要确保onSaveInstanceState()回调实际上确实保存了重建视图所需的任何实例状态。这样,如果片段实际上完全被破坏,FragmentManager可以在以后需要重新创建片段时恢复状态。