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