一个活动和所有其他碎片
我正在考虑用Activity
和其他managing all the fragments thru the activity
Fragments
屏幕来实现一个屏幕,并managing all the fragments thru the activity
。
这是一个好主意吗? 我的答案是否定的,但我仍想更清楚地了解这个想法。
这个主意有什么优点和缺点?
注意:
请不要给我片段和活动的链接。
编辑:
这里是关于碎片和活动的东西:
优点:
- 碎片意味着与活动一起使用作为一项子活动。
- 碎片不是活动的替代品。
- 碎片意味着可重用性(需要知道以何种方式实现可重用性)。
- 片段是编写代码以支持平板电脑和手机的最佳方式。
缺点:
- 我们需要实现接口来从碎片中获取数据。
- 对于对话,我们必须走很长的路要展示它。
如果我们不考虑平板电脑,为什么要用碎片呢? 活动和片段之间的起始时间差是多less?
这取决于你正在创build的应用程序。 我已经创build了几个应用程序使用这两种方法,不能说一种方式总是比另一种更好。 我创build的最新应用程序使用单一的Activity
方法和Facebook风格的导航。 从导航列表中select项目时,我将更新一个单独的Fragment
容器以显示该部分。
也就是说,单个Activity
也会带来很多复杂性。 比方说,你有一个编辑表单,用户需要select或创build的一些项目,要求他们去一个新的屏幕。 有了活动,我们只需用startActivityForResult
调用新的屏幕,但是使用Fragments
就不会有这样的事情,所以你最终将这个值存储在Activity
,并且让主编辑片段检查Activity
来查看是否已经select了数据并且应该显示给用户。
Aravind所说的被卡住单个Activity
types也是如此,但并不是真正的限制。 你的活动将是一个FragmentActivity,只要你不需要一个MapView
那么没有任何实际的限制。 如果你确实想显示地图,可以这样做,但是你需要修改Android兼容库来让FragmentActivity
扩展MapActivity
或者使用公开的android-support-v4-google地图 。
最终,我所知道的大多数开发人员都去了一个Activity
路线已经回到多个活动,以简化他们的代码。 用户界面明智,在平板电脑上,你有时被卡住使用一个单一的Activity
只是为了实现什么疯狂的互动,你的devise师拿出:)
– 编辑 –
Google终于发布了MapFragment
到兼容库,所以你不必再使用android-support-v4-googlemaps hack。 请阅读这里的更新: Google Maps Android API v2
我即将完成一个项目(5个月的发展),有1个活动,17个片段,全部全屏。 这是我的第二个基于片段的项目(以前是4个月)。
优点
- 主要活动是700行代码,只是很好地pipe理片段导航的顺序。
- 每个片段被很好地分成它自己的类,并且是相对较小的(〜几百行ui东西)。
- pipe理层可以说,“嘿,我们如何切换这些屏幕的顺序”,我可以很容易地做到这一点,因为这些片段并不相互依赖,他们都通过活动进行交stream。 我不必挖掘个人的活动,find他们互相呼叫的地方。
- 我的应用程序是非常重的graphics,并将永远不会作为1屏幕1的活动。 在内存中的所有这些子活动都会使应用程序一直运行内存不足,所以我将不得不
finish()
所有不可见的活动,并使用相同的控制逻辑进行导航,就像使用碎片一样。 也可能只是因为这个,才会用碎片来做。 - 如果我们做过平板电脑的应用程序,我们将有一个更容易重新分解的东西,因为一切已经很好地分开了。
缺点
- 你必须学习,如何使用片段
首先,无论你做什么,都要确保你有一个模块化devise,使用模型,视图,演示者,而不是高度依赖于活动或片段。
活动和片段真正提供什么?
- 生命周期事件和后台
- 上下文和资源
因此, 仅用于此 。 他们有足够的责任,不要过于复杂。 我会争辩说,甚至在活动或片段中使用TextView是不好的做法。 有一个原因像公共查看findViewById(INT ID)的方法是PUBLIC 。
现在问题变得更简单:我需要多个独立的生命周期事件和后台堆栈吗? 如果你认为可能,使用碎片。 如果你想永远不要,不要使用碎片。
最后,你可以做自己的后台和生命周期。 但是,为什么重新创build轮子?
编辑:为什么投这个? 单一目的类的人! 每个活动或片段都应该能够实例化一个实例化视图的演示者。 主持人和观点是一个可以互换的模块。 为什么一个活动或片段有主持人的责任?
优点
你可以控制你的片段从一个单一的活动,因为所有的片段是相互独立的。 片段有自己的生命周期( onPause
, onCreate
, onStart
…)。 通过生命周期,片段可以独立地响应事件,通过onSaveInstanceState
保存它们的状态,并被带回(例如,在来电后恢复,或者当用户点击后退button时)。
缺点
- 在您的活动代码中创build复杂性。
- 你必须pipe理片段的顺序。
永远不要less,这是一个很好的主意,就好像你需要创build一个应用程序,你想要显示几个视图。 通过这个想法,您将能够在单个视图中查看多个片段。
这取决于你的应用程序的devise布局。 假设如果在devise布局的ActionBar中使用Tabs,那么在应用程序的Single Activity中,可以在Tab中单击更改片段。 所以现在你有一个活动,并假设在ActionBar中的三个Tabs和由Fragments提供的标签视图,这使得易于pipe理加上也是可行的。 所以,这一切都取决于你的应用程序的devisescheme,以及你如何做出决定。
优点:
- 可以用来创build一个单一的界面,可以通过xml布局使用多种屏幕尺寸和方向。
缺点:
- 在您的活动中需要更复杂的代码。
我相信这是一个好主意,因为根据当前屏幕大小和方向使用不同的xml布局可以使应用程序更具可用性,并且如果您计划为手机和平板电脑发布应用程序,则可以减less发布多个版本应用程序的需求。 如果你的应用程序永远不会被平板电脑和手机使用,这可能是不值得的麻烦。
我支持把所有的通货膨胀视为碎片来提供更好的灵活性。 例如,对于聚合多个片段并在手机上重复使用相同片段以在每个片段上显示一个屏幕的平板电脑具有单个着陆活动。 但是在电话实现中,我将为每个屏幕分别开展一项活动。 这些活动不会有太多的代码,因为他们会立即推迟到他们的观点通货膨胀的片段。
由于标签或菜单导航只是产生一个全新的屏幕,因此在select标签或滑出菜单时,手机实现必须更改为单个登陆活动,这是一个糟糕的主意。
我会给不使用单一活动方法的最重要的原因是可以利用活动生命周期。 活动包含应用程序的某个部分的上下文行为,片段补充了该行为。 有能力利用活动生命周期中的可重复步骤,有助于使用诸如onPause
和onResume
方法将一个活动的行为与另一个活动的行为分开。 此生命周期还允许您返回到上一个上下文。 使用单一活动方法,一旦你离开一个片段,你必须创build一个机制来返回它。