使用Fragment

欢马劈雪     最近更新时间:2020-08-04 05:37:59

90

优点

  • 简化对UI的重用,将UI和交互放到Fragment里面,可以方便的针对不同设备设置不同的UI(如pad显示两个fragment,phone显示一个);

完整生命周期

使用fragment

  • 直接在layout.xml里面声明一个Fragment
  • 使用FragmentManager动态添加、替换、移除;
    • 必须通过FragmentTransaction来完成动态改变;
    • addToBackStack()方法可以支持通过返回键回退到上一个Fragment;
  • Fragment的isInLayout()方法可以判断Fragment是否已经显示;
  • 可以通过放在不同文件夹下(values,values-land等)的xml文件中的变量值,在代码中动态获取值,来达到判断当前运行模式/设备的目的;
  • Fragment的Transaction支持动画;

使用Fragment进行后台处理(Headless Fragment)

  • onCreateView返回null;
  • 结合setRetainInstance()方法,让Fragment在应用程序配置发生变化(横竖屏、屏幕尺寸)时,不会被destroy,从而继续执行后台任务;
  • 通过为Fragment设置tag,可以在之后获取fragment实例;
  • 效果类似于MVP中的ViewState;

Fragment不利于单元测试

  • Fragment的life cycle很复杂
  • View controllers? Not so fast.
    操作view,有很多view相关的代码,不利于单元测试
  • Fragment transactions
    异步过程,当接收到多个click事件,或者configuration changes时,程序将处于未知状态
  • Fragment creation magic
    fragment manager可能会使用反射接口重新创建fragment,而fragment有可能会作为内部类被定义,没有public的构造函数,问题就来了
  • Fragments: lessons learned
    • Single Activity Interface:使用不同的Fragment实现界面,动效、生命周期将变得更容易
    • The backstack isn't an activity specific notion; you can implement a backstack within an activity.
    • There is no need for new APIs; everything we needed was there from the very beginning: activities, views, and layout inflaters.
  • Responsive UI: fragments vs custom views
  • 扩展阅读:使用custom views构建single activity app:Simpler Android apps with Flow and Mortar

Fragment Transactions & Activity State Loss

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
展开阅读全文