[英]Restoring Fragment Instance with references
简短版:我想知道当片段包含对无法序列化或复制且需要保留在内存中的对象的引用时,如何重新创建片段状态(例如,在屏幕旋转之后)。
较长的 版本:在我的应用程序中,我使用连接到自定义FragmentPagerAdapter的ViewPager ,该InstanceInstantiate实例化许多片段,这些片段显示ListView中包含的数据(日程表)。 所有这些都包含在父片段中。 当由适配器实例化时,每个页面片段都将传递一个对执行多个操作的单个对象(“ ScheduleManager ”)的引用:
本质上, ScheduleManager将所有内容组合在一起,并实现了我的应用程序的这一部分(“时间表”)的主要逻辑,即加载和提供数据,以及通过ActionMode修改和重新定义它的方法 。 我不知道这是不是很好的设计...
我的问题是在这种情况下应该如何还原Fragments实例状态? 我无法将ScheduleManager序列化为一个包,因为它将松开对Context和LoaderManager的引用(否则,我当然会使用setArguments / getArguments )。 另外,所有页面片段都必须引用ScheduleManager的相同实例,否则共享操作模式将不起作用。 除此之外,我不想每次还原片段时都复制整个计划数据。 我想将该对象保留在内存中,并让页面片段在还原时回收对其的引用。
我想我可以让包含的活动保存ScheduleManager并让PageFragment查询它作为参考。 但是,如果可能的话,我宁愿将父片段中的所有内容保持独立且模块化(不同项目的时间表可能不同)。 虽然我在写这篇文章的时候感觉到这是没有办法的。
当然,当重新创建父片段时,它也可以重新创建ScheduleManager并向其提供所需的引用( Context + LoaderManager )。 问题是父片段的每个实例最多只能有一个ScheduleManager实例,因此如何使嵌套的页面片段重新连接到它。
这是我最终要做的事情:
public void onCreate(Bundle savedInstanceState)
{
Fragment fragment = this.getActivity().getFragmentManager().findFragmentByTag("SCHEDULE");
if (fragment instanceof ScheduleMasterFragment)
{
ScheduleMasterFragment master = (ScheduleMasterFragment) fragment;
this.scheduleManager = master.getScheduleManager();
}
else
{
throw new RuntimeException("SchedulePageFragment must be " +
"the child of a ScheduleMasterFragment with Tag set to 'schedule'");
}
super.onCreate(savedInstanceState);
}
ScheduleManager是我要保留的参考。 至少以这种方式,我将所有代码保留在片段本身内,除了ScheduleMasterFragment
中的getScheduleManager
,这是有意义的,因为ScheduleMasterFragment
某种程度上是ScheduleManager实例的所有者。
仍然欢迎任何更好的解决方案...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.