我遇到了一个很大的问题,我不太明白发生了什么。我正在开发一个使用 Fragments(来自支持库)的应用程序,并且正在使用FragmentTransaction.replace()
将新的 Fragments 放置到后台堆栈并替换旧的。代码如下所示:
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();
这成功替换了我的片段。我的问题如下。在一个片段中,我有一个根据用户输入构建的项目列表。现在,当用户单击下一步然后单击后退按钮(返回列表)时,列表为空,因为视图已被破坏。现在,我注意到以下几点:
- onSaveInstanceState 没有被调用。我相信这是因为只有在父 Activity 告诉它时才会调用它。根据文档:“在许多情况下,片段可能大部分被拆除(例如,当放置在没有显示 UI 的后台堆栈时),但在其拥有的活动实际需要保存其状态之前,它的状态不会被保存."。显然,对 FragmentTransaction 执行替换并不是其中之一。有人对此有确认或更好的解释吗?
- setOnRetainInstanceState(true) 在这种情况下没有帮助。同样,我相信这与文档中的信息有关:“控制是否在 Activity 重新创建期间保留片段实例(例如从配置更改中)”。我没有在重新创建活动时执行任何操作,所以这没有用。
所以,我想我的主要问题是:有没有办法在使用时保留视图状态(只保留片段)replace
?有FragmentTransaction.add()
,但也有一些问题。一种是没有执行退出动画,因此动画不正确。另一个是旧片段(被置于不可见状态的片段)仍然可以点击的新片段。例如,如果我有一个 ListFragment,并且我通过使用 add 在其上放置一个内容片段,我仍然可以单击 ListFragment 中的列表项。