1

我的应用程序中有一个特殊的片段流,因此我需要能够切换到任何片段,同时尽可能将片段保留在内存中(所以如果内存紧张,可以释放片段)。

到目前为止,我已经成功地替换了当前片段,但问题是前一个片段总是被破坏,所以如果我回到它(例如使用操作栏),它会重新创建并这需要一些时间。

我使用片段而不是活动的原因是操作栏的良好使用,将多个片段放入同一个容器中的能力,非灵活的活动意图使用等......

我不使用“返回”堆栈的原因是我希望从任何片段转到任何片段,因为流程可以改变。

这是我的代码片段:

Fragment fragment=... ; //get the fragment from cache or create if not available yet...
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.mainActivity_fragmentContainer, fragment).commit();

我也尝试过使用 ViewPager,但由于我不想具有滑动效果(它允许您滑动到其他片段)并且由于其中一个片段已经包含 viewPager,所以它是一个障碍。禁用主 viewPager 上的滑动效果会以某种方式在另一个上禁用它。

顺便说一句,我使用的是片段的 android 支持库,而不是原生 API。

我的问题是:我如何才能完全控制要转到哪个片段,同时最大限度地提高速度并避免太多内存用于片段?


编辑:现在,我使用下一个解决方法:对于 onDestroyView,我采用创建视图的父级并从那里删除创建的视图。

对于 onCreateView ,如果我已经拥有之前创建的视图,我会返回它。

但是,我认为这是一件非常冒险的事情,因为我不确定片段管理是如何工作的,所以它可能会导致奇怪的问题。另外,我不确定如果 android 确定它的内存不足会发生什么 - 它会破坏未使用的片段(这很好)还是会导致内存不足异常(这很糟糕)。

4

2 回答 2

0

实现目标的一种方法是使用 FragmentTransaction.show 和 FragmentTransaction.hide。您可以使用 Fragment.isAdded 来确定是第一次显示还是调用 FragmentTranscation.add。缺点是当显示和隐藏片段时你不会得到暂停/恢复事件;您将需要覆盖 onHiddenChanged。如果您想支持后退导航,您还必须管理自己的堆栈。

于 2013-11-15T15:55:37.043 回答
0

我同意你关于“风险很大”的评论。由于您的方法的后果不是很清楚,我不建议使用它。

为了更好地了解您的问题并给您一些指示:

  1. 你认为什么是慢?我也一直“疯狂”地切换片段,它在平板电脑上运行良好,但在一些低端手机上需要更长的时间——但仍然可以接受

  2. 您的片段需要创建多少工作?即每次需要准备什么样的底层数据?(同样,我有几个超过 1k 条目的列表片段,它们每次都准备好,而且速度非常快)

  3. 你如何准确地替换片段?你特别打电话给getFragmentManager().executePendingTransactions();

于 2012-04-22T15:51:19.043 回答