如果我们指定不同的 behavior,会有不同的表现。
1、当 behavior 为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 时,ViewPager中切换 Fragment,setUserVisibleHint 方法将不再被调用,他会确保onResume 的正确调用时机。
2、当 behavior 为 BEHAVIOR_SET_USER_VISIBLE_HINT,跟之前的方式是一致的,我们可以通过 setUserVisibleHint 结合 fragment 的生命周期来监听。
//FragmentStatePagerAdapter构造方法
public FragmentStatePagerAdapter(@NonNull FragmentManager fm,
@Behavior int behavior) {
mFragmentManager = fm;
mBehavior = behavior;
}
//FragmentPagerAdapter构造方法
public FragmentPagerAdapter(@NonNull FragmentManager fm,
@Behavior int behavior) {
mFragmentManager = fm;
mBehavior = behavior;
}
@IntDef({BEHAVIOR_SET_USER_VISIBLE_HINT, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT})
private @interface Behavior { }
既然是这样,我们就很好适配呢,直接在 onResume 中调用 checkVisibility方法,判断当前 Fragment 是否可见。
回过头,Behavior 是如何实现的呢?
以 FragmentStatePagerAdapter 为例,我们一起来看看源码。
@SuppressWarnings({“ReferenceEquality”, “deprecation”})
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
//当前显示Fragment
mCurrentPrimaryItem.setMenuVisibility(false);
if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
//最大生命周期设置为STARTED,生命周期回退到onPause
mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED);
} else {
//可见性设置为false
mCurrentPrimaryItem.setUserVisibleHint(false);
}
}
//将要显示的Fragment
fragment.setMenuVisibility(true);
if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
//最大 生命周期设置为RESUMED
mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
} else {
//可见性设置为true
fragment.se tUserVisibleHint(true);
}
//赋值
mCurrentPrimaryItem = fragment;
}
}
代码比较简单很好理解。
当 mBehavior 设置为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 会通过setMaxLifecycle 来修改当前Fragment和将要显示的Fragment的状态,使得只有正在显示的 Fragment执行到 onResume() 方法,其他Fragment 只会执行到 onStart() 方法,并且当 Fragment 切换到不显示状态时触发 onPause() 方法。
当 mBehavior 设置为 BEHAVIOR_SET_USER_VISIBLE_HINT 时,会当 frament 可见性发生变化时调用 setUserVisibleHint() ,也就是跟我们上面提到的第一种懒加载实现方式一样。
===================================================================================
这种