Android开发中,Fragment真的有大家说的那么不堪吗?

看到有人说activity。。我觉得不是这个逻辑吧,fragrant和activity的关系又不是对立的。就像我说listview不好用你就说grid…
关注者
393
被浏览
52,829

26 个回答

大部分说它不堪的人,很可能只是不想学习使用它而已,管理个Fragment能有多麻烦。

当然实际中应该根据情况选择是否使用Fragment,有些情况下使用Fragment(比如嵌套)会有一些难解决的Bug,而为了开发效率很多时候也可以直接简单粗暴地用Activity(听说贴吧就是这样的)。

来填坑了~

你们确定用对了 Fragment 了么?:) 居然还有说 Fragment 失去出现意义的,请先弄明白 Fragment 出现的意义是什么好不。

Fragment 的出现一方面是为了缓解 Activity 任务过重的问题,另一方面是为了处理在不同屏幕上 UI 组件的布局问题,而且它还提供了一些新的特性(例如 Retainable)来处理一些在 Activity 中比较棘手的问题。

  • Fragment 拥有和 Activity 一致的生命周期,它和 Activity 一样被定义为 Controller 层的类。有过中大型项目开发经验的开发者,应该都会遇到过 Activity 过于臃肿的情况,而 Fragment 的出现就是为了缓解这一状况,可以说 它将屏幕分解为多个「Fragment(碎片)」(这句话很重要),但它又不同于 View,它干的实质上就是 Activity 的事情,负责控制 View 以及它们之间的逻辑。
  • 将屏幕碎片化为多个 Fragment 后,其实 Activity 只需要花精力去管理当前屏幕内应该显示哪些 Fragments,以及应该对它们进行如何布局就行了。这是一种组件化的思维,用 Fragment 去组合了一系列有关联的 UI 组件,并管理它们之间的逻辑,而 Activity 负责在不同屏幕下(例如横竖屏)布局不同的 Fragments 组合。
  • 这种碎片不单单能管理可视的 Views,它也能执行不可视的 Tasks,它提供了 retainInstance 属性,能够在 Activity 因为屏幕状态发生改变(例如切换横竖屏时)而销毁重建时,依然保留实例。这示意着我们能在 RetainedFragment 里面执行一些在屏幕状态发生改变时不被中断的操作。例如在 ToastAndroid/StartActivity.kt at master 我使用了 RetainedFragment 来缓存在线音乐文件,它在横竖屏切换时依然维持下载进度,并通过一个 DialogFragment 来展示进度。

其实从 Google 推出 Support 包来支持在早些版本实现 Fragment 这一行为就可以看出,谷歌认为 Fragment 比 Activity 更适合管理屏幕组件,因为 Activity 在单屏下无法细分,注定了如果使用 Activity 来管理页面所有 UI 组件的话会造成组件耦合以及不可复用,代码也臃肿地会令人头痛。总而言之,我认为使用 Fragment 绝对是一种好习惯。


4 reasons to use Android Fragments

,这篇文章解释了在四个地方应该使用 Fragments。


另附 Fragment 的正确用法,遇到坑的都可以去好好理解下:

nekocode/ToastAndroid · GitHub