使用 Activity 启动 Fragment 会更好吗?

Posted

技术标签:

【中文标题】使用 Activity 启动 Fragment 会更好吗?【英文标题】:Is it better to use an Activity to start a Fragment? 【发布时间】:2014-12-13 23:22:37 【问题描述】:

我只有一个 Activity 和一个容器 Fragment 时遇到问题,然后我会根据需要替换它。这是正确的方法吗,还是每个Fragment 都有自己的Activity

例如,使用PreferenceFragment 是否可以从我的MainActivity 做这样的事情:

fm.beginTransaction()
  .replace(R.id.container, new SettingsFragment())
  .addToBackStack(null)
  .commit();

还是只启动一个新的Activity(例如SettingsActivity)来处理Fragment 事务会更好吗?

主要问题与旋转设备有关,但这是一个单独的问题。

【问题讨论】:

您对包含一个FragmentActivity 有什么具体问题? @forcewill,轮换,但我现在不太担心。 @Elltz,什么?我想你误解了这个问题。 @ElefantPhace 你应该问两个分开的问题然后:p 在任何情况下Fragments 被放置在Inside 活动中,而不是相反,这就是@Elltz 想说的。 一开始我并没有问两个,因为我还不关心这个问题。我知道他在说什么,和我在这里问什么无关 【参考方案1】:

这是怎么做的: 有一个单一的活动 - N-Number的片段!

根据您的要求,您可以使用 ReplacingAttaching, Detaching 看看这个 *** 问题,了解执行片段事务的不同方式: Fragment methods: attach(), detach(), remove(), replace(), popBackStack() 看看这个 *** 问题,了解何时使用替换以及何时使用分离:difference between detaching a Fragment and removing it 看看这个 *** 问题,了解如何处理方向变化:Understanding Fragment's setRetainInstance

您的问题would it be better to just launch a new Activity (e.g. SettingsActivity) that handles the Fragment transactions?

Ans:: 你可以有一个 Activity,不需要另一个 Activity !


最佳实践 :: 最好有一个activity和多个fragment

原因片段为您提供了重用的优势,并且许多高级控件对片段起作用!

【讨论】:

【参考方案2】:

活动通常是服务于单一目的的小程序。它们的范围可以从非常具体和小到相当复杂。片段是 Activity 的各个部分,旨在协同工作以完成 Activity 所需的所有工作。 Fragment 旨在做好一件事和一件事。如果要显示一篇文章,那就是它的作用。它不关心文章列表,或者改变用户偏好或类似的东西。因此,如果您有一个仅用于显示文章的 Activity,那么这就是您将拥有的唯一片段。

如果您为每个 Activity 使用一个片段,那么您基本上是在转向旧的做事方式(pre-fragment)。这绝对没有错。毕竟事情就是这样。它只会增加混乱,因为您将拥有一个 Fragment 文件和一个 Activity 文件以及其他东西。

一个很好的例子可能是图库应用。最初,您将拥有一个 Activity,其中包含三个松散耦合的 Fragment,它可以交换出去。

GalleryFragment - 显示可用图片和视频的列表。

PictureFragment - 显示具有放大和旋转功能的图片。

VideoFragment - 显示带有播放控件的视频。

就像 Suhail Mehta 所说,如果您的设计需要,您可以在平板电脑上将这些片段一起展示,并且您几乎不需要更改。

稍后,您决定允许其他 3rd 方通过隐式 Intent 共享您的图库应用。为此,您需要再做两个活动:

PictureActivity - 显示提供的图片。仅使用 PictureFragment。

VideoActivity - 仅显示视频。仅使用 VideoFragment。

因此,添加、删除和更新功能非常容易。

【讨论】:

【参考方案3】:

每个片段上不应该有自己的活动。片段用于具有单一导航方法或具有多窗格 UI。

片段必须始终嵌入到活动中,并且片段的生命周期直接受宿主活动生命周期的影响。但这并不意味着您将每个片段都嵌入到新的活动中,片段不是为此目的而设计的。

新闻应用程序可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示一篇文章——两个片段并排出现在一个活动中,每个片段都有自己的一组生命周期回调方法并处理自己的用户输入事件。因此,用户可以选择一篇文章并在同一个活动中阅读所有文章,而不是使用一个活动来选择一篇文章和另一个活动来阅读文章。

因此,在 Activity 中使用片段的正确做法取决于您的 UX/UI。

【讨论】:

是的,我明白了。但是以我上面的例子为例,使用 PreferenceFragment。我希望它完全取代容器,而不是在它旁边。我可以做这么多,我在问我的方法是否可以接受,或者我应该启动一个新的 Activity 来处理这个? 您可能正在使用导航抽屉来替换导航抽屉项目单击时的片段。是的,你可以弹出一个新的设置活动,它注意到错误。它只取决于可用性。 不,不使用导航抽屉,我知道我可以做到这一点。我在问这样做的最佳做法是什么

以上是关于使用 Activity 启动 Fragment 会更好吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Activity 启动 Fragment?

使用 Transition 从 Fragment 启动 Activity(API 21 支持)

如何从 Fragment 启动 Activity?

Activity与Fragment的生命周期详解

Activity和Fragment周期介绍

Intent 不会从 Fragment 启动 Activity