Fragment: Yes or Not

2014, square在其技术博客上发表了Advocating Against Android Fragments,阐述了使用fragment可能会遇到的问题。

  1. lifecycle过于复杂
  2. hard to debug, FragmentManagerImpl的代码过于复杂。
  3. Fragment transactions 是异步的(post到UI队列的尾端),可能导致程序处于未知的状态
  4. 创建匿名内部Fragment时,如果activity要恢复这个fragment时,会因为找不到无参构造函数而报错。
    比如
DialogFragment dialogFragment = new DialogFragment() {
  @Override public Dialog onCreateDialog(Bundle savedInstanceState) { ... }
};
dialogFragment.show(fragmentManager, tag);

会出现以下错误

android.support.v4.app.Fragment$InstantiationException:
    Unable to instantiate fragment com.squareup.MyActivity$1:
    make sure class name exists, is public, and has an empty
    constructor that is public

所以Square提倡使用custom view来取代Fragment。

不过Fragments也有其自身的好处:

  1. 能够保存view的状态,如果用custom view,需要开发者自己保存状态,增加了复杂度
  2. 对backstack的支持,custom view如果要支持backstack,需要使用第三方库,比如FlowSimpleStack

一种使用Fragment的pattern是One-Activity-Multiple-Fragments architecture

现在Fragment的bug大多已经fix了,通过使用MVP,将business logic移到Presenter中,可以减少Fragment的错误。所以还是大胆用Fragment吧

Fragment 仍然存在的bug(已用最新的support-v7:26.1.0测试来源):

  1. Nested Fragment在父Fragment的离开动画时会消失

  2. Nested Fragment setRetainInstance is inherited(已经修复)

  3. Nested Fragment onActivityResult is broken(已经修复)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容