2012-10-09 65 views
6

我有关于是否对ViewPager使用View或Fragment的问题。在ViewPager中使用视图或片段

背景: 我有一个活动A包含一个ListView。每个ListView项目打开活动B.活动B显示不同的内容,具体取决于活动A中的哪个ListView项目被点击。 活动B的内容显示在ListView内。

问题: 现在,而不是来回活动A和B之间进行切换的内容,我有一个要求执行水平视图滑动到所有内活动B.切换内容 一种解决方案,我发现(试过和它的作用)是创建Activity B的ListView的许多实例,并将其与ViewPager + PagerAdapter一起使用。 在doc上找到的另一个可能的解决方案(还没有尝试过)是将该ListView放入Fragment中,创建该片段的许多实例并将其与ViewPager + FragmentPagerAdapter或FragmentStatePagerAdapter一起使用。

我的问题是,使用每种方法有什么好处?我应该经历将ListView引入片段还是仅仅将ListView与ViewPager一起使用的麻烦?

感谢

回答

10

一个Fragment是一个有用的方法,我想,当你要配合一些UI的业务逻辑到特定View(或一组)。如您所知,个人Fragment有其自己的生命周期回调等等,就像Activity那样。

而不是具有通过单个PagerAdapter单个Activity主机许多ListView s时,可能吸尘器使用Fragment的方法,因为仅Fragment需要处理后面驱动单个ListView的逻辑。

这与我刚刚面对的情况非常相似。我在ViewPager内显示了各种垂直滚动表单(包含大量输入字段)。在我的情况下,我去了Fragment方法,因为在我的情况下,ViewPager实际上可能需要在某些页面上显示完全不同的视图。例如,在前几页中,可能会显示用户输入表单。但在最后一页上,会显示一个图表。需要一整套独立的逻辑来驱动该图。为了驱动这些输入表单,单个Activity中的一个图形会有点混乱,我可能需要在几个委托类或其他东西中包含业务逻辑。因此,对我而言,Fragment是最后的明显选择。我有我的InputFormFragmentGraphFragment,它们每个都只包含它们提供的View的适用逻辑。

要考虑的另一件事是,在不久的将来,您也可能想要在ViewPager中显示不同种类的View。或者,您可能希望完全使用另一个用户界面布局,可能不是使用ViewPager,而是将其全部并排显示(例如横向模式下大型平板电脑上使用的布局)。使用Fragment时,事情只是更加模块化,您可以将代码分解为更快速的操作。另一方面,如果您通过使用包含简单PagerAdapter以及ListView的所有逻辑的单个Activity实现了您的目标,您可能会发现将来需要做更多工作来支持新类型的View或特殊的平板电脑布局。

有一件事我要说的是已经通过FragmentPagerAdapterFragmentStatePagerAdapterViewPager实施Fragment小号自己,事情可能会变得,如果您有任何特殊的要求有点别扭;管理Fragment有时可能会很棘手。例如,对于我的UI,我需要能够以编程方式添加和删除包含FragmentViewPager。我还需要确保所使用的适配器在被显示后不会破坏Fragment,因为我需要在某个点同时收集所有Fragment的数据。此外,我必须扩展并修改FragmentPagerAdatper以确保Fragment正确地通过onDestroy(),并在ViewPager被移除时从FragmentManager中删除。

Fragment s为各种屏幕尺寸和方向构建用户界面提供了一种非常模块化的方式,并且在如何允许您封装各个UI元素的业务逻辑和生命周期方面非常出色。但是,如果您的场景确实与ViewPager中的几个ListView一样简单,并且您知道您永远不需要模块化,那么Fragment的开销可能是一种矫枉过正。

+0

关于从片段收集信息,创建一个接口不是更容易吗,片段是否拥有对实现它的对象的引用,并使用接口函数将信息存储在该对象中? – 2013-01-14 09:39:31

+0

如果我理解正确,我认为你的建议是,而不是需要做聪明的事情,以确保所有碎片留在ViewPager周围(并不是经常被杀死,然后再次创建),我应该有一个机制坚持自己的国家。我可以做到这一点,我同意这将是一个更好的方法,但我的特定应用程序中的碎片构造起来相当昂贵。由于编码和性能方面的原因,确保所有碎片保持在一起,然后请求他们都将数据一起提交,这更直接。 – Trevor