android - 为什么不总是使用一个 Activity 的 fragment

标签 android android-fragments

为什么会有人创建活动,而不是一个有许多片段的活动?我看到,使用片段可以更容易地共享数据,而且您可以更好地使用onpause来确定应用程序是转到后台还是正在切换片段。
我遗漏了什么吗?
谢谢

最佳答案

(为提前的长答辩道歉)
我认为没有什么能阻止你这么做。
话虽如此,我如何看待活动是一个地方,在这里我可以定义当前过渡的整个UI屏幕应该如何:它应该包括哪些片段以及这些片段应该如何并排地坐着,更重要的是应用程序流是如何工作的。
我的活动中的片段应该一起构成一个有意义的屏幕,其中包含我期望的功能,并且应该是可重用的,但是它们不应该知道其他片段的存在。这就是活动的工作。事实上,我强烈遵守一个片段不应该知道另一个片段存在的规则(尽管现在你可以把碎片包含在碎片中,这会破坏这一点)。如果我需要转换到一组完全不同的用例,我更喜欢使用活动来处理转换和新的布局以及要使用的片段集。
我必须这么做吗?不。我可以在一个主要的活动中完成这一切,我自己也可以完成这些“准活动片段”之间的转换,但既然已经有一个框架为我完成这项工作,我为什么要这么做呢?使用意图初始化活动(过渡)比手动编写自己的引擎要简单得多,而且更干净,它能跟踪我所有的片段的状态,并决定哪些要启动,哪些要摆脱。
同样地,处理不同的方向和设备大小比使用自己的功能更容易做到,但没有什么能阻止你这么做。
在一个例子中更容易解释这一点:
想象一下这个用例:我需要编写一个显示歌曲和电影列表的应用程序。当我点击其中一首歌曲时,它应该会打开一个媒体播放器并在单独的屏幕上播放,当我点击一部电影时,它应该会打开一个视频播放器并播放视频。这里有明显的转变:从主列表到音频播放器或视频播放器和返回。
只使用一个活动和3个片段,我必须用适当的媒体播放器片段(视频/音频)替换列表片段,并在用户单击列表项时自行清除列表片段(以保存内存)。这一切都很好,很容易做到,但如果我还必须添加一种方式来添加评论到歌曲/电影会发生什么?现在,我必须修改我的主(也是唯一的)活动来理解这样的行为:如果有人正在播放一首歌并单击“评论”按钮,我需要再次转换到另一个片段,并允许该片段捕获/显示评论。
正如你可能想象的那样,每当我添加一个新的功能时,我必须修改我的主要活动来处理这个转变,因为片段不意味着彼此了解,并且意味着彼此独立。
如果我只有一个活动,我最终会做的是创建一个god类(我的主活动),在这里定义我的应用程序的整个流。随着应用程序变得复杂,维护此流程将变得越来越复杂。同样,这是基于有独立片段的原则。如果你不在乎彼此了解的片段,那是完全不同的,但在我看来,你做得不对:)
我该如何利用活动来做呢?我仍然有3个片段,但是也有3个活动,它们的唯一工作是维护到其他活动的转换,并定义应该使用哪个片段。在列表活动与歌曲活动之间转换是一个简单的意图,释放内存是为我完成的。现在,如果歌曲活动需要转换为评论活动,那么这只是歌曲活动中评论活动的另一个意图。我不必改变列表活动,事实上,列表活动永远不会知道这个评论活动的存在。
我知道这是一个非常简单的例子,但是随着你的应用程序变得越来越复杂,随着你添加越来越多的用例,你会发现拥有多个活动是有意义的。您不想自己维护片段之间的转换,否则您将得到一个非常复杂的框架,它将慢慢变得无法维护。
根据屏幕的方向和大小,相同的逻辑适用于具有不同的片段/布局。同样,无论如何,你可以在你唯一的活动中处理这些事情,但问题是:为什么?

关于android - 为什么不总是使用一个 Activity 的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725473/

相关文章:

android - Material 设计 : Where to place elevation in android styles?

Android OAuth 改造访问 token 请求

java - 如何显示我的菜单 Activity ?

android - 如何检查 SectionsPagerAdapter 选项卡是否可见

java - 将数据从 fragment 发送到另一个 Activity 时不会调用 OnActivityResult

java - Android 上的 Fragment 膨胀问题

java - 一段时间后通知

java - 从内部类中返回类型 void 的重写方法返回

Android Studio - 在 fragment 中使用 Assets 管理器设置自定义字体

android - 无法删除 nav_host_fragment 顶部的空间