使用引用还原片段实例

时间:2013-01-30 02:01:55

标签: android android-fragments restore

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

长版: 在我的应用程序中,我使用连接到自定义 FragmentPagerAdapter ViewPager ,它实例化了一些显示ListView中包含的数据(计划)的片段。所有这些都包含在父片段中。当适配器实例化时,每个页面片段都会传递一个对象(“ ScheduleManager ”)的引用,该对象执行以下操作:

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

基本上, ScheduleManager 将所有内容保存在一起并实现我的应用程序的这个(“日程”)部分的主要逻辑,即加载和提供数据,以及通过修改和重新加载它的方法一个 ActionMode 。我不知道这是不是很好的设计...

我的问题是我应该如何在这些情况下恢复Fragments实例状态?我无法将 ScheduleManager 序列化为一个包,因为它会松开对Context和 LoaderManager 的引用(其他地方,当然我会使用 setArguments / getArguments )。此外,所有页面片段必须具有对 ScheduleManager 的同一实例的引用,否则共享操作模式将不起作用。除此之外,我不希望每次恢复片段时都复制整个计划数据。我希望将此对象保留在内存中,并让页面片段在恢复时回收对它的引用。

我想我可以让包含活动保存 ScheduleManager 并让 PageFragment 查询它以供参考。但是如果可能的话,我宁愿保持父片段中的所有内容都是自包含的和模块化的(对于不同的项目可以有不同的时间表)。虽然写这篇文章虽然我觉得没有办法解决这个问题。

当然,当重新创建父片段时,它还可以重新创建 ScheduleManager 并向其提供所需的引用(上下文 + LoaderManager )。问题是,对于父片段的每个实例, ScheduleManager 只能有一个实例,因此如何使嵌套的页面片段重新连接到它。

1 个答案:

答案 0 :(得分:1)

这是我最终做的事情:

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是我想要保留的参考。至少这样我将所有代码保留在片段本身中,除了getScheduleManager中的ScheduleMasterFragment这是有道理的,因为ScheduleMasterFragment不知何故是ScheduleManager实例的所有者。

仍然欢迎任何更好的解决方案......