美文网首页
Fragment: Yes or Not

Fragment: Yes or Not

作者: yangweigbh | 来源:发表于2017-12-01 13:29 被阅读23次

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(已经修复)

相关文章

网友评论

      本文标题:Fragment: Yes or Not

      本文链接:https://www.haomeiwen.com/subject/gfaibxtx.html