在Android中完全管理片段流

时间:2012-04-22 14:43:14

标签: android android-activity transactions fragment flow

我的应用程序中有一个特殊的片段流,所以我需要能够切换到任何片段,同时尽可能将片段保留在内存中(所以如果它在内存上很紧,那么片段就会被释放)

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

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

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

以下是我的代码片段:

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上的滑动效果会以某种方式在另一个上禁用它。

BTW,我正在使用android支持库来获取片段,而不是本机API。

我的问题是: 如何实现对哪个片段的完全控制,同时最大化速度并避免将太多内存用于片段?


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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

  1. 你觉得什么慢?我一直在切换片段“像疯了一样”,它在平板电脑上运行正常,但在某些低端手机上它需要更长时间 - 但仍然可以接受

  2. 您的片段需要创建多少工作?即每次需要预先准备什么样的基础数据? (再次,我有几个列表片段超过1k,每次都准备好了,而且速度很快)

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

答案 1 :(得分:0)

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