官方说明
- 为了自动恢复Fragment状态,Fragment需要有(三选一):
- id
- tag
- 容器有id
- FragmentTransaction 是一个标准的Command模式,将transaction压栈,供后续back时进行revert操作,不调用addToBackStack将会导致Fragment的引用被释放
- commit不是立即执行,而是向UI Handler post了一个runnable,这个runnable把当前所有的任务都完成后,释放UI 线程。使用的就是executePendingTransactions()
- 只能在Activity的onSaveInstanceState前调用commit。commitAllowingStateLose不限
- 与Activity通信推荐使用自定义Listener
- 如果需要定义ActionBar上的menu,需要在onCreate中setHasOptionsMenu()
- Menu的handle顺序是先Activity后Fragment
- 不同平台上的具体逻辑(portrait和landscape下的行为变化)需要手动改变
源码
- Fragment继承自Object,是MVC中的C层,其成员变量mView才是V
- A.Class.isAssignableFrom(B),检测A是不是B的父类(接口)或相同
- 用ArrayMap存类比用Class.forName快,因为没有同步块,也少很多层调用
mCalled = false;
检测被override的方法是否被调用
onViewStateRestored(savedInstanceState);
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onViewStateRestored()");
}- Fragment持有其所在的Activiy的强引用
- onInflate是在onAttach之前调用的,官方推荐只进行参数的读存,即设置xml中的默认参数,在onCreate中设置bundle中的参数
- onDestroyView被调用时,view还未从其parent上被移走
- 必须调super.foo()的函数有:
- onViewStateRestored
- onCreate
- onActivityCreated
- onStart
- onResume
- onPause
- onStop
- onDestroyView
- onDestroy