使用Fragment
	
												欢马劈雪     最近更新时间:2020-08-04 05:37:59
	
												
											 
	
											
											
优点
- 简化对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)