为何setMaxLifecycle可替代Android Fragment已废弃的getUserVisibleHint
Fragment
getUserVisibleHint 废弃与 setMaxLifecycle 替换方案解答 1. 为什么setMaxLifecycle可以替代getUserVisibleHint
原来的getUserVisibleHint是基于独立标记位的可见性判断方案,和Fragment本身的生命周期完全解绑,容易出现状态时序不一致的问题,比如生命周期已经销毁但标记位还显示可见的异常。setMaxLifecycle是AndroidX Fragment 1.3.0之后推出的生命周期管控方案,本质是通过直接限制Fragment的最大可到达生命周期状态,来对齐可见性:
- 当Fragment被允许走到
RESUMED状态时,对应用户可见 - 当Fragment被限制最大只能到
STARTED状态时,对应用户不可见
整套机制直接把可见性和生命周期绑定,替代了原来独立标记位的方案,并不是set方法直接替代get方法,而是整个可见性管控的逻辑从「读写独立标记位」改成了「读写生命周期状态」,setMaxLifecycle是用来控制状态的入口。
2. 原有可见性判断逻辑的改写
你之前的判断代码不能直接改成调用setMaxLifecycle,setMaxLifecycle是用来设置状态的方法,没有返回值,不能放在if判断里。原来的逻辑要改成判断当前Fragment的生命周期状态:
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { // 原有getUserVisibleHint为true时的逻辑 }
3. setMaxLifecycle的参数说明
setMaxLifecycle是FragmentTransaction的方法,需要传入两个参数:
- 第一个参数:要管控生命周期的Fragment实例
- 第二个参数:
Lifecycle.State枚举值,常用的两个取值:Lifecycle.State.STARTED:限制Fragment最大只能走到STARTED状态,不可见,等价于原来的setUserVisibleHint(false)Lifecycle.State.RESUMED:允许Fragment走到RESUMED状态,可见,等价于原来的setUserVisibleHint(true)
常用场景示例
如果是配合ViewPager使用,不需要手动调用setMaxLifecycle,只要给FragmentPagerAdapter指定BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数即可,Adapter内部会自动给当前选中的Fragment设置最大生命周期为RESUMED,其他Fragment限制为STARTED:
new FragmentPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { @NonNull @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } };
内容的提问来源于stack exchange,提问作者ssa
相关产品推荐
相关产品推荐

