android support下的fragment懒加载通过
setUserVisibleHint实现,但在androidx中已过期,源码提示使用
FragmentTransaction#setMaxLifecycle
使用FragmentTransaction.setMaxLifecycle的方法可以看到
可以看到熟悉的
FragmentPagerAdapter类
看
fragment.setUserVisibleHint(true)的条件,
mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT,后者为常量,看到mBehavior的赋值通过构造方法
我们加载fragment的一种方式
public class SectionsPagerAdapter extends FragmentPagerAdapter { private String[] mTitles; private List<Fragment> mFragments; /** * @param fm FragmentManager getSupportFragmentManager or getChildFragmentManager() * @param behavior FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 懒加载 * @param mTitles 标题 * @param mFragments fragment */ public SectionsPagerAdapter(@NonNull FragmentManager fm, int behavior, String[] mTitles, List<Fragment> mFragments) { super(fm, behavior); this.mTitles = mTitles; this.mFragments = mFragments; } @NonNull @Override public Fragment getItem(int position) { return mFragments.get(position); } @Nullable @Override public CharSequence getPageTitle(int position) { return mTitles[position]; } @Override public int getCount() { return mFragments == null ? 0 : mFragments.size(); } }
看到fragment生命周期的执行,反复切换fragment,onResume会重新执行
简单写了一下,问题是这么解决的,有兴趣的可以加载fragment时测试分别设置观察fragment的生命周期
mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED),
mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED),