一个活动和所有其他片段


158

我想实现一个屏幕,Activity和所有其他sreens与Fragmentsmanaging all the fragments thru the activity

这是个好主意吗?我的回答是“ 否”,但我仍然想更清楚地了解这种想法。

这个想法有什么优点和缺点?

注意:

请不要给我有关片段和活动的链接。

编辑:

以下是有关片段和活动的一些信息:

优点:

  1. 片段应与活动一起用作子活动。
  2. 碎片不是活动的替代品。
  3. 片段旨在实现可重用性(需要知道以何种方式可以实现可重用性。)。
  4. 片段是编写支持平板电脑和手机的代码的最佳方法。

缺点:

  1. 我们需要实现接口以从片段中获取数据。
  2. 对于对话,我们必须走很长的路才能显示出来。

如果不考虑使用平板电脑,为什么还要使用碎片?活动和片段之间的开始时间差是多少?


您能详细说明为什么您认为答案是否定的吗?我碰巧不同意,但是如果我们知道这些担忧是什么,那么解决您可能对这种方法的担忧就容易得多。
亚历山大·卢卡斯

1
@AlexanderLucas我没有给出答案,因为这样做会使您的代码模块化程度降低,增加了复杂性。
Vineet Shukla 2012年

@Ski您将更加专注于接受答案,请专注于所要提出的问题以及应该提供的最佳答案。
Vineet Shukla 2012年

3
对于任何发现此问题的人,我停止了重构,因为事情变得非常复杂,而且很快。
theblang 2014年

18
这是一个很好的问题,不应关闭。
吉姆在德克萨斯州

Answers:


94

这取决于您正在创建的应用程序。我已经使用这两种方法创建了多个应用程序,但是不能说一种方法总是比另一种更好。我创建的最新应用程序使用了单一Activity方法和Facebook样式导航。从导航列表中选择项目时,我将更新一个Fragment容器以显示该部分。

就是说,一个人Activity也带来了很多复杂性。假设您有一个编辑表单,对于用户需要选择或创建的某些项目,要求它们进入新屏幕。在进行活动时,我们只会使用来调用新屏幕,startActivityForResultFragments在没有这种情况的情况下,您最终将值存储在上,Activity并让主编辑片段检查,Activity以查看是否已选择数据并将其显示给用户。

Aravind所说的坚持单一Activity类型的说法也是正确的,但并非如此。您的活动将是FragmentActivity,只要您不需要,MapView那么就没有真正的限制。如果您确实想显示地图,可以这样做,但是您需要修改Android兼容性库以进行FragmentActivity扩展,MapActivity或者使用公开可用的android-support-v4-googlemaps

最终,我所知的大多数开发者都走了一条Activity路,然后又回到了多个Activity来简化他们的代码。在平板电脑上,UI明智的做法是,有时您只能使用一个Activity插件来完成您的设计师想出的疯狂互动:)

-编辑-

Google终于发布MapFragment了兼容性库,因此您不再需要使用android-support-v4-googlemaps hack。在此处了解有关更新的信息:Google Maps Android API v2

-编辑2-

我刚刚阅读了这篇关于现代碎片状态(2017)的精彩文章,并想起了这个旧答案。我想分享的内容:片段:所有Android问题的解决方案


6
settargetfragment,您可以处理诸如startforresult程序之类的活动。
Lalith B

1
我认为活动的存在仅仅是因为它是旧系统。片段以前不存在。除了形式之外,活动实际上没有其他内容,片段也没有。我什至可以想象,在某些时候,活动被删除了,而一切都是碎片。
Ixx 2013年

1
总结片段的弊端,只有您自己提供,实际上没有。就像Lalith B所说的startActivityForResult有一个对应项,地图也不是问题。除此之外,所有内容(保存状态等)都可以使用片段的生命周期方法进行处理。
Ixx 2013年

85

我将要完成一个项目(开发中需要5个月的时间),该项目有1个活动和17个片段,全屏显示。这是我的第二个基于片段的项目(之前是4个月)。

优点

  • 主要活动是700行代码,只是很好地管理了片段导航的顺序。
  • 每个片段都很好地分成了自己的类,并且相对较小(〜几百行ui东西)。
  • 管理层可以说:“嘿,我们如何切换这些屏幕的顺序”,我可以很容易地做到这一点,因为这些片段彼此不依赖,它们都通过活动进行通信。我不必深入研究各个活动,也不必查找彼此之间的联系。
  • 我的应用程序的图形非常繁琐,因此永远无法用作1屏幕1活动。内存中的所有这些子活动都会使应用程序始终耗尽内存,因此,我将不得不处理finish()所有不可见的活动,并为导航创建相同的控制逻辑,就像处理片段一样。正因为如此,也可以对片段进行处理。
  • 如果我们使用平板电脑应用程序,我们将可以更轻松地进行重构,因为一切都已经很好地分离了。

缺点

  • 你必须学习如何使用片段

1
不确定会有太多碎片,只有现在才活动...生产中的任何问题,都应归咎于您!!:)
Shahar

1
@Dinash不要让os重新启动您的活动。处理方向改变自己。在此处了解更多信息:stackoverflow.com/questions/5913130/…–
塔马斯

1
@Tamas您是否有任何多片段的屏幕(例如,主从屏幕),如果是的话,您是如何处理的?
theblang

7
@Tamas这种方法是严重反android。您最终获得了神课。Android系统旨在与活动配合使用-例如,您没有很好的方法来处理多个片段中的工具栏。您没有获得结果的开始片段,还有更多没有结果的片段。这意味着您必须重写已经存在的整个逻辑。本地广播接收器,服务和其他Android组件呢?为了启动服务,您必须执行以下操作:getActivity()!= null ...这确实很丑。如果您有很多fr,片段之间的通信也很奇怪。
Teodor

9
700线!!!“很好” ???班是免费的。
beplaya

16

首先,无论做什么,请确保您使用的模型,视图,演示者的模块化设计不高度依赖于Activity或Fragment。

活动和片段真正提供了什么?

  1. 生命周期事件和回退
  2. 上下文和资源

因此,将它们用于此目的。他们有足够的责任,不要过分复杂化。我认为即使在Activity或Fragment中初始化TextView也是不好的做法。诸如public View findViewById(int id)之类的方法PUBLIC是有原因的。

现在,问题变得更简单了:我是否需要多个独立的生命周期事件和堆栈?如果您认为是的话,请使用片段。如果您从未想过,请不要使用片段。

最后,您可以创建自己的堆栈和生命周期。但是,为什么要重新制造轮子呢?

编辑:为什么对此投反对票?单目的班人!每个活动或片段都应该能够实例化用于实例化视图的演示者。演示者和视图是可以互换的模块。为什么活动或片段应由主持人负责?


嗯...实例化视图是一种不好的做法,而findViewById()公共之间的联系尚不清楚。尽管我同意视图的实例化,但我也考虑从其他类调用findViewById(例如,托管片段的活动在片段上调用它)是一种不好的做法。真的不知道为什么要公开,因为至少在我能想到的情况下,这会导致代码混乱,而不是模块化设计。
Ixx 2013年

恕我直言:如果您将活动传递给视图和演示者(将2组合称为“模块”),则会使该模块与其他活动无法重用。如果有帮助,最好将活动作为仅暴露必要的想法的活动通过。如果您不想在活动之外找到视图,则可以通过该界面将所有视图注入到pres./view中。主要观点是我认为Android编码应该超出Actvities和Frags的概念,这样才能轻松切换btwn 2。码。
beplaya 2014年

3
放开MVP,如果没有Android,它会更好。您可能会花费大量时间尝试通过具有不同形状的孔来装配某个形状的块,确保这是一个挑战,但是可能会有一些功能上的需求,所以您最好花些时间。
straya 2015年

12

优点

您可以通过单个活动控制片段,因为所有片段都彼此独立。该片段有一个生命周期(onPauseonCreateonStart自己的...)。通过具有生命周期,片段可以独立响应事件,通过保存片段的状态onSaveInstanceState并被带回(例如,在传入呼叫后恢复或用户单击“后退”按钮时)。

缺点

  1. 在活动代码中增加复杂性。
  2. 您必须管理片段的顺序。

不管怎样,这是一个好主意,好像您需要创建一个要显示多个视图的应用程序一样。通过这种想法,您将能够在一个视图中查看多个片段。


2

这取决于您的应用程序的设计布局。假设如果您在设计版式的ActionBar中使用Tabs,则在应用程序的Single Activity中,可以在单击Tab键时更改片段。因此,现在您有了一个Activity,并假设ActionBar中的三个选项卡以及Fragments提供的选项卡的视图,这使得易于管理以及可行也是可行的。因此,这完全取决于应用程序的设计方案以及您如何决定为其构建应用程序。


1

优点:

  • 可用于创建单个界面,该界面可通过xml布局用于多种屏幕尺寸和方向。

缺点:

  • 在您的活动中需要更复杂的代码。

我认为这是个好主意,因为如果您计划同时发布手机和平板电脑的应用程序,则根据当前屏幕的大小和方向使用不同的xml布局可以使该应用程序更加实用,并减少发布多个版本的应用程序的需要。如果平板电脑和手机都不会使用您的应用程序,那么就不值得为此烦恼。


对于定向,没有必要使用不同的基于xml的布局。
Vineet Shukla 2012年

@VineetShukla是的,但这是一个选择,就像根据屏幕大小使用不同的xml布局一样。例如,当我以横向或纵向查看Android手机的主屏幕时,其布局会有所不同。
2012年

0

我赞成将所有视图的膨胀推迟到各个片段上以提供更好的灵活性。例如,针对平板电脑进行一次登陆活动会汇总多个片段,然后在电话上重复使用相同的片段,以显示每个片段一个屏幕。但是在电话实现中,每个屏幕都有一个单独的活动。这些活动将没有太多的代码,因为它们将立即顺应其零碎的内容以查看通货膨胀。

我认为在引入选项卡或滑出菜单时,将电话实现更改为单个着陆活动是一个坏主意,因为选项卡或菜单导航只会产生一个全新的屏幕。


“我认为在引入选项卡或滑出菜单时,将电话实现更改为单个着陆活动是一个坏主意,因为选项卡或菜单导航只会产生一个全新的屏幕。” ->确切的含义难以理解,但单项活动应用程序(平板电脑/电话)中的选项卡或侧面菜单都不是问题。
Ixx 2013年

-1

我不使用单一活动方法的最重要原因是可以利用活动生命周期。活动包含应用程序特定部分的上下文行为,而片段补充了该行为。能够利用活动生命周期中可覆盖的步骤的能力有助于通过诸如onPause和的方法将一个活动的行为与另一个活动分开onResume。该生命周期还允许您返回到先前的上下文。使用单一活动方法,一旦留下一个片段,就必须创建一种机制来返回该片段。


4
我不相信这是真的。来自Fragment生命周期文档(developer.android.com/guide/components/fragments.html#Lifecycle):“该片段所在的活动的生命周期直接影响了该片段的生命周期,因此该活动的每个生命周期回调对每个片段都会产生类似的回调。例如,当活动接收到onPause()时,活动中的每个片段都会接收到onPause()。”
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.