繁体   English   中英

使用参考还原片段实例

[英]Restoring Fragment Instance with references

简短版:我想知道当片段包含对无法序列化或复制且需要保留在内存中的对象的引用时,如何重新创建片段状态(例如,在屏幕旋转之后)。

较长的 版本:在我的应用程序中,我使用连接到自定义FragmentPagerAdapterViewPager ,该InstanceInstantiate实例化许多片段,这些片段显示ListView中包含的数据(日程表)。 所有这些都包含在父片段中。 当由适配器实例化时,每个页面片段都将传递一个对执行多个操作的单个对象(“ ScheduleManager ”)的引用:

  • 包含要显示的数据
  • 持有对Context对象的引用(以访问SharedPreferences
  • 保留对父片段LoaderManager的引用,以便它可以重新加载数据
  • 实现OnClickActionMode回调侦听器(以能够创建和处理适用于所有页面的动作模式;页面片段将对象作为侦听器添加到其ListViews中)
  • 定义一个回调接口,以通知侦听器状态更改或何时重新加载数据(页面片段将自己注册为侦听器)。

本质上, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM