androidx下的fragment中onHiddenChanged方法不会被调用,这就导致了懒加载实现方式要变更
前置条件:
BottomNavigationView+ViewPager+fragment
FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
说明一下behavior的值:
BEHAVIOR_SET_USER_VISIBLE_HINT:使用这个创建的时候,当当前页面fragment可见不可见的时候setUserVisibleHint方法会被调用,
也就是我们之前的懒加载方法仍然可以使用,只是目前setUserVisibleHint这个方法被取消了,不建议使用,所以创建时候这个也不建议使用
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT:只有当前的fragment可见的时候,才会调用onResume方法,其他的只会调用到onStart方法
创建adapter对象,传入了behavior
这里不同fragment切换时候,只有在显示的时候才会调用onResum方法,所以只需要在onResume中判断是否可见就可以了,具体代码如下:
public abstract class BaseFragment extends Fragment {
/**
* 表示是否已经加载过了
*/
private boolean isLoaded = false;
/**
* 表示是否可见
*/
private boolean isVisible = false;
@Override
public void onResume() {
super.onResume();
isVisible = true;
judzyLoadData();
}
private void judzyLoadData(){
if (!isLoaded && isVisible){
loadData();
isLoaded = true;
}
}
@Override
public void onDestroy() {
super.onDestroy();
isVisible = false;
isLoaded = false;
}
public abstract void loadData();
}
实际测试有效,只会调用一次
fragment内部嵌套fragment情况也测试了一下
三个主Fragment:HomeFragment、DashboardFragment、NotificationsFragment;在HomeFragment中嵌套3个MyFragment,测试懒加载方法,但是如果HomeFragment内部创建子Fragment方式一样,就会导致调用onCreateView方法,重新创建ViewPager和内部Fragment,所以需要只创建一次fragment
原来Activity中实现方法:
public class FragmentTestActivity1 extends AppCompatActivity {
private BottomNavigationView bottomNavigationView;
private ViewPager viewPager;
private List<Fragment> fragments;
private List<String> titles;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_test1);
bottomNavigationView = findViewById(R.id.bottom_navigation);
viewPager =findViewById(R.id.pager);
fragments = new ArrayList<>();
titles = new ArrayList<>();
fragments.add(new HomeFragment("homeFragment1"));
titles.add("homeFragment1");
fragments.add(new DashboardFragment