写上一篇ViewPager2软文时,我发现最新的Fragment
代码淘汰了setUserVisibleHint
方法,转而支持用setMaxLifecycle
方法,setMaxLifecycle
言外之意是设置最大生命周期
,懂行的人应该知道,Fragment
一直都是没法直接设置生命周期,必须经过add
、attach
、remove
、detach
、show
、hide
方法间接干预,原本就此功能,简单介绍一下setMaxLifecycle
的原理和上手效果;android
阅读指南:bash
androidx 1.1.0-alpha07
版本的fragment
进行,也是支持setMaxLifecycle
的最低版本FragmentPagerAdapter
进行setMaxLifecycle
示例应用讲解setMaxLifecycle
定义在FragmentTransaction
中,和以前的add
、attach
、remove
、detach
、show
、hide
等方法是并列关系;markdown
FragmentTransactionide
public FragmentTransaction setMaxLifecycle(@NonNull Fragment fragment, @NonNull Lifecycle.State state) { addOp(new Op(OP_SET_MAX_LIFECYCLE, fragment, state)); return this; } 复制代码
参数解读:this
fragment
即须要操做的Fragment对象,前提条件是这个fragment
必须已经加到FragmentManager
中;state
Lifecycle.State
枚举类型,该参数的使用条件是至少是Lifecycle.State.CREATED
,不然报IllegalArgumentException
异常Lifecycle.State
一共有五个状态,最低要求是Lifecycle.State.CREATED
,因此该方法可用的参数有CREATED
、STARTED
、RESUMED
,State
和生命周期方法
有何区别,下面简单解释一下:spa
在Fragment中,定义了五种State
,这里的State
并不是上面说Lifecycle.State
,可是逻辑基本上是一致的;code
INITIALIZING
初始状态CREATED
已建立状态ACTIVITY_CREATED
彻底建立,可是没有startedSTARTED
建立并启动,可见不可操做RESUMED
建立启动并可操做
本文内容只对CREATED
、STARTED
、RESUMED
这三个状态讲解,因为Fragment中定义的mState
和Lifecycle.State
不是同一状态,在本文视为同一律念;orm
各位确定都知道Fragment生命周期有onDestory
,onStop
等方法,可是状态却没有这么多,那么如何标识状态和对应关系,下面给出对应关系;对象
首先,我把生命周期方法从onCreate
->onCretateView
->onStart
->onResume
->onPause
->onStop
-> onDestoryView
->onDestory
视为从小到大排序;排序
一样的,咱们把生命周期状态CREATED
->STARTED
->RESUMED
视为从小到大排序;
CREATED状态
CREATED
即已建立状态,狭义的理解是生命周期方法走到onCreate
,若是当前fragment状态已大于CREATED
,则会使fragment生命周期方法走到onDestoryView
,若是小于CREATED
,则走到onCreate
;因此CREATED
有两种状况;
STARTED状态
同理,STARTED
状态也有两种状况,若是当前fragment状态已大于STARTED
,则会使fragment生命周期方法走到onPause
,若是小于CREATED
,则走到onStart
;
RESUMED状态
RESUMED
表示的状态比较特殊,只表明onResume
状态,不管大到小仍是小到大,最终都是停留到onResume
状态;
以上生命周期状态扭转结论基于FragmentManagerImpl.moveToState()
方法提取,若有误导,请指教
setMaxLifecycle
能够单独使用,也能够配合add
等方法组合使用,首先,咱们分析单独执行add
命令的状态变化:
单独执行add操做
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frame_layout,cardFragment);
fragmentTransaction.commit();
复制代码
add配合setMaxLifecycle(Lifecycle.State.CREATED)
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frame_layout,cardFragment);
fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.CREATED);
fragmentTransaction.commit();
复制代码
add配合setMaxLifecycle(Lifecycle.State.STARTED)
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frame_layout,cardFragment);
fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.STARTED);
fragmentTransaction.commit();
复制代码
add配合setMaxLifecycle(Lifecycle.State.RESUMED)
FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
fragmentTransaction.add(R.id.frame_layout,cardFragment);
fragmentTransaction.setMaxLifecycle(cardFragment, Lifecycle.State.RESUMED);
fragmentTransaction.commit();
复制代码
单独使用setMaxLifecycle
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.setMaxLifecycle(cardFragment, xxx);
fragmentTransaction.commit();
复制代码
RESUMED
状态的Fragment进行操做CREATED
操做RESUMED
状态的Fragment进行操做STARTED
操做RESUMED
状态的Fragment进行操做CREATED
操做,在进行STARTED
操做因为篇幅缘由,就不一一介绍各类组合状况,只要弄清楚生命周期状态,不管是状态是升仍是降,不论组合仍是单用,你均可以驾驭;
因为setMaxLifecycle
带来了生命周期设置,替换掉了老旧的setUserVisibleHint
方法,因此在FragmentPagerAdapter
中也进行了适配
FragmentPagerAdapter
public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;
public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;
private final int mBehavior;
public FragmentPagerAdapter(@NonNull FragmentManager fm) {
this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);
}
public FragmentPagerAdapter(@NonNull FragmentManager fm,@Behavior int behavior) {
mFragmentManager = fm;
mBehavior = behavior;
}
复制代码
最新的FragmentPagerAdapter
用一个mBehavior
来控制setUserVisibleHint
和setMaxLifecycle
二选一的局面; mBehavior
在构造方法中指定;
从代码能够看出,用setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED)
替代setUserVisibleHint(false)
,用setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
替代setUserVisibleHint(true)
;
为何要用Lifecycle.State.STARTED
?由于这里本质上用的是add
+Lifecycle.State.STARTED
和attach
+Lifecycle.State.STARTED
组合;
最终的结果是不可见的Fragment只会走到生命周期onStart
方法,不会走onResume
方法;
综上,过去使用setUserVisibleHint
来控制Fragment懒加载,在最新版的FragmentPagerAdapter里有新思路,能够切换到BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
模式,在FragmentonResume
里判断,更符合显示逻辑;
切换到BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
模式,须要调用俩参数的构造方法:
new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
复制代码
破事水了小半天,本文到底说了什么内容,仍是作个总结吧:
首先使用setMaxLifecycle
能进一步的控制Fragment
生命周期,一句话形容就是对add
、attach
等命令的补充;
其次该功能在官方控件中得以运用,改善了ViewPager
+Fragment
的使用体验,懒加载注意点;
最后鼓励你们(主要是本身)多看源码,夯实基础,方能不变应万变,本文结束。