使用FragmentTransaction.replace()时Android片段视图状态丢失

时间:2013-04-12 17:39:12

标签: android android-fragments android-fragmentactivity android-lifecycle

我有一个非常大的问题,我不太了解发生了什么。我正在开发一个使用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();

这是成功替换我的片段。我的问题如下。在一个片段中,我有一个根据用户输入构建的项目列表。现在,当用户单击下一步然后单击后退按钮(返回列表)时,列表为空,因为视图已被销毁。现在,我注意到以下内容:

  1. 未调用onSaveInstanceState。我相信这是因为只有当父Activity告诉它时才会调用它。基于以下文档:“在很多情况下,片段可能大部分被拆除(例如放置在没有显示UI的后台堆栈上),但是在其拥有的活动实际需要保存其状态之前不会保存其状态“。显然,在FragmentTransaction上执行替换不是其中之一。有没有人对此有确认或更好的解释?
  2. setOnRetainInstanceState(true)在这种情况下没有帮助。同样,我认为这与文档中的信息有关:“控制是否在活动重新创建(例如从配置更改)中保留片段实例”。我没有在重新创建活动时执行任何操作,所以这没用。
  3. 所以,我想我的主要问题是:在使用replace时,有没有办法保留视图状态(只是保留片段)?有FragmentTransaction.add(),但也存在一些问题。一个是没有执行退出动画,因此动画不正确。另一个是旧片段(即处于不可见状态的片段)仍然是可点击的新片段。例如,如果我有一个ListFragment,并且我使用add将内容片段放在其上,我仍然可以单击ListFragment中的列表项。

2 个答案:

答案 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可以在以后需要重新创建片段时恢复状态。