一项活动和所有其他片段[关闭]

Posted

技术标签:

【中文标题】一项活动和所有其他片段[关闭]【英文标题】:One Activity and all other Fragments [closed] 【发布时间】:2012-08-22 16:19:43 【问题描述】:

我正在考虑使用Activity 实现一个屏幕,并使用Fragmentsmanaging all the fragments thru the activity 实现所有其他屏幕。

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

这个想法的优缺点是什么?

注意:

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

编辑:

这是片段和活动:

优点:

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

缺点:

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

如果我们不考虑平板电脑,为什么还要使用片段? Activity和Fragment的起始时间差是多少?

【问题讨论】:

您能否详细说明为什么您认为答案是否定的?我碰巧不同意,但如果我们知道这些担忧是什么,就更容易解决您可能对该方法的担忧。 @AlexanderLucas 我给出的答案是“否”,因为这样做会降低您的代码模块化程度,增加复杂性。 @Ski 你更专注于让你的答案被接受,请专注于被问到的内容以及你可以提供的最佳答案。 对于任何发现这一点的人,我停止了重构,因为事情很快变得非常复杂。 这是个好问题,不应该被关闭。 【参考方案1】:

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

也就是说,拥有一个 Activity 也会带来很多复杂性。假设您有一个编辑表单,对于用户需要选择或创建的某些项目,需要他们转到新屏幕。对于活动,我们只需使用startActivityForResult 调用新屏幕,但使用Fragments 没有这样的东西,因此您最终将值存储在Activity 上并让主编辑片段检查Activity 以查看是否数据已被选中并应显示给用户。

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

我认识的大多数走Activity 路线的开发人员最终都回到了多个活动以简化他们的代码。 UI 方面,在平板电脑上,你有时会被困在使用单个 Activity 只是为了实现你的设计师想出的疯狂交互:)

-- 编辑--

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

-- 编辑 2--

我刚刚阅读了这篇关于现代(2017 年)片段状态的精彩文章,并记住了这个旧答案。想我会分享:Fragments: The Solution to All of Android's Problems

【讨论】:

settargetfragment,你可以像startforresult这样处理活动。 在我看来,活动的存在只是因为它是旧系统。片段以前不存在。除了形式之外,没有什么活动能和片段不能。我什至可以想象,在某些时候活动被删除,一切都是片段。 总结碎片的缺点——只有你给,真的没有。正如 Lalith B 所说,startActivityForResult 有对应的,地图也不是问题。除此之外,一切(保存状态等)都可以使用片段的生命周期方法处理。【参考方案2】:

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

优点

主要活动是 700 行代码,只是很好地管理片段导航的顺序。 每个片段都很好地分离到自己的类中,并且相对较小(大约几百行 ui 内容)。 管理层可以说,“嘿,我们切换这些屏幕的顺序怎么样”,我可以很容易地做到这一点,因为这些片段不相互依赖,它们都通过活动进行通信。我不必深入研究各个活动,就可以找到他们互相称呼的地方。 我的应用程序图形很重,永远不会作为 1 屏幕 1 活动。内存中的所有这些子活动都会使应用程序一直耗尽内存,所以我必须finish()所有不可见的活动,并为导航制作相同的控制逻辑,就像我对片段所做的那样。正因为如此,还不如用碎片来做。 如果我们曾经开发过平板电脑应用程序,我们将更容易重构东西,因为一切都已经很好地分开了。

缺点

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

【讨论】:

不确定是否有太多片段,只有现在才活动......生产中的任何问题,都怪你! :) @Dinash 不要让操作系统重新启动您的活动。自己处理方向变化。在这里阅读更多:***.com/questions/5913130/… @Tamas 您是否有任何多片段屏幕(例如 master-detail),如果有,您是如何处理的? @Tamas 这种方法严重反安卓。你最终得到了上帝的课程。 Android 系统旨在与活动一起工作 - 例如。您没有很好的方法来处理多个片段中的工具栏。您没有结果的开始片段,还有更多没有。这意味着您必须重写已经存在的整个逻辑。本地广播接收器、服务和其他 android 组件呢?为了启动服务,您必须执行以下操作: getActivity() != null ...这真的很难看。如果你有很多fr,片段之间的通信也会很奇怪。 700 行!!!! “不错”???课程免费。【参考方案3】:

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

Activity 和 Fragments 真正提供了什么?

    生命周期事件和回栈 背景和资源

因此,仅限使用它们。他们有足够的责任,不要过度复杂化他们。我认为即使在 Activity 或 Fragment 中实例化 TextView 也是不好的做法。 public View findViewById (int id) 之类的方法是 PUBLIC 是有原因的。

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

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

编辑:为什么要投反对票?单目的班人!每个活动或片段都应该能够实例化一个实例化视图的演示者。演示者和视图是可以互换的模块。为什么一个activity或者fragment应该有presenter的职责??

【讨论】:

嗯...实例化视图是一种不好的做法与公开 findViewById() 之间的联系尚不清楚。虽然我同意视图的实例化,但我也认为从其他类调用 findViewById(例如,托管片段的活动在片段上调用它)是一种不好的做法。真的不知道为什么这是公开的,因为至少在我能想到的情况下,这会导致代码混乱而不是模块化设计。 恕我直言:如果您将一个活动传递给您的视图和演示者(将这两个组合称为“模块”),您可以将该模块与其他活动一起重用。如果有帮助,最好将活动作为只公开必要事物的入口传递。如果你讨厌在活动之外寻找视图,那么你可以通过该接口将所有视图注入到 pres./view 中。要点是我相信 Android 编码应该超越 Activity 和 Frags 的概念,以便轻松切换 2 。代码。 放开MVP,没有它你会过得更好。安卓。您可能会花费大量时间尝试通过不同形状的孔来安装特定形状的块,这当然是一个挑战,但您可能会更明智地花时间在功能要求上。【参考方案4】:

优点

您可以从单个活动中控制您的片段,因为所有片段都是相互独立的。片段有自己的生命周期(onPauseonCreateonStart...)。通过拥有生命周期,Fragment 可以独立响应事件,通过onSaveInstanceState 保存其状态,并被带回(例如在来电后恢复或用户单击返回按钮时)。

缺点

    在您的活动代码中创建复杂性。 您必须管理片段的顺序。

无论如何,这是一个不错的主意,就像您需要创建一个应用程序一样,您希望在其中显示多个视图。通过这个想法,您将能够在一个视图中查看多个片段。..

【讨论】:

【参考方案5】:

这取决于您应用的设计布局。假设如果您在设计布局中使用 ActionBar 中的选项卡,那么在应用程序的单个活动中,可以在选项卡单击时更改片段。所以现在你有一个 Activity 并假设 ActionBar 中有三个 Tabs 和由 Fragments 提供的选项卡的视图,这使得管理变得容易,而且也是可行的。 因此,这完全取决于您的应用程序的设计方案以及您如何决定为它构建。

【讨论】:

【参考方案6】:

优点:

可用于通过 xml 布局创建可供多种屏幕尺寸和方向使用的单一界面。

缺点:

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

我认为这是一个好主意,因为如果您打算为两款手机发布应用,则根据当前屏幕尺寸和方向使用不同的 xml 布局可以使应用更实用,并减少发布多个版本的应用的需要和平板电脑。如果您的应用永远不会同时被平板电脑和手机使用,那么这可能不值得麻烦。

【讨论】:

对于方向,没有必要使用不同的基于 xml 的布局。 @VineetShukla true,但它是一个选项,就像根据屏幕大小使用不同的 xml 布局一样。例如,当我以横向和纵向查看我的 Android 手机的主屏幕时,它的主屏幕布局不同。【参考方案7】:

我支持将所有视图膨胀推迟到片段以提供更好的灵活性。例如,平板电脑有一个单一的着陆活动,它聚合了多个片段,并在手机上重用相同的片段以每个片段显示一个屏幕。但是,在电话实现中,每个屏幕都有一个单独的活动。这些活动不会有太多代码,因为它们会立即推迟到对应的片段以进行视图膨胀。

我认为当引入选项卡或滑出菜单时,手机实现必须更改为单个登陆活动是一个坏主意,因为选项卡或菜单导航只会导致一个全新的屏幕。

【讨论】:

"我认为当引入选项卡或滑出菜单时,手机实现必须更改为单个登陆活动是一个坏主意,因为选项卡或菜单导航只会导致一个全新的屏幕。” -> 无法理解您的确切意思,但是在单活动应用程序(平板电脑/手机)中,选项卡或侧边菜单都不是问题。【参考方案8】:

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

【讨论】:

我不相信这是真的。来自 Fragment 生命周期文档 (developer.android.com/guide/components/fragments.html#Lifecycle) :“片段所在的活动的生命周期直接影响片段的生命周期,因此活动的每个生命周期回调都会导致每个片段的回调类似。例如,当activity收到onPause()时,activity中的每个fragment都会收到onPause()。"

以上是关于一项活动和所有其他片段[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

未创建 Android listview 内容视图

从其他活动返回到同一片段时,如何保存和恢复片段中 RecyclerView 的滚动位置?

从片段返回到上一个活动 onclick back button

从片段中获取输入数据

如何在不锁定活动方向的情况下锁定片段方向?

想要使用片段从导航抽屉活动移动到另一个屏幕,以在所有屏幕上显示抽屉