当前位置:   article > 正文

Fragment里面有ViewPager,ViewPager里面又嵌套Fragment,刚遇到的一个坑_fragment嵌套fragment+viewpager

fragment嵌套fragment+viewpager

在碎片嵌套碎片遇到的坑

1,在父Fragment中的onCreateView方法里面调用方法去对ViewPager进行初始化,并且new 了四个碎片的对象添加到viewpager里面

 @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_layout06, container, false);
        init();
        //绘制线性图
        mp_LineChart();
        //初始化ViwPager
        init_ViewPager();
        System.out.println("onCreate");
        return view;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
private void init_ViewPager() {
        List<Fragment> list = new ArrayList<>();
        barChart = new Mp_BarChart();
        lineChar_1 = new Mp_LineChar_1();
        lineChar_2 = new Mp_LineChar_2();
        lineChar_3 = new Mp_LineChar_3();
        list.add(barChart);
        list.add(lineChar_1);
        list.add(lineChar_2);
        list.add(lineChar_3);
        viewPager =view.findViewById(R.id.frag6_viewpager);
        viewPager.setAdapter(new Frag6_ViewPager_Adapter(getChildFragmentManager(),list));
        viewPager.setOffscreenPageLimit(3);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        ......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2,因为我四个子碎片都是要做网络请求的,而且请求的接口都一样,所以我想在父碎中直接进行网络请求,然后通过在初始化ViewPager时候的碎片对象调用一个set方法,直接把网络请求的值设置进去。

 @Override
    public void onResume() {
        System.out.println("onResume");
        Random random = new Random();
        barChart.setData(random.nextInt(130-90+1)+90);
        super.onResume();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3,就在父碎片 中用子碎片的对象 调用他的setData方法,报了空指针,经过一系列的研究和请教 才发现在父碎片的生命周期的onResume方法执行完之后才会开始执行子碎片的生命周期,也就是说不能再onResume方法中调用自碎片的方法,因为在这个时候子碎片的生命周期还没用执行。所以子碎片没有被初始化,会报错,


4,解决的办法

  • ,在onResume方法里面加一个定时器,当经过多少秒之后才调用子碎片的方法,这样就不会报错,但是一定要控制倒计时的时间,我测了一下0.5秒以上一般是没有问题的。如果想更安全就让倒计时的时间长一点就好。
  @Override
    public void onResume() {
        System.out.println("onResume");
        CountDownTimer startTime = new CountDownTimer(500,500) {
            @Override
            public void onTick(long millisUntilFinished) {
            }
            @Override
            public void onFinish() {
                Random random = new Random();
                barChart.setData(random.nextInt(130-90+1)+90);
            }
        }.start();
        super.onResume();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 或者是做一个接口回调,当子碎片加载完了回调接口去拿到数据就可以了。

总结一下就是 :当一个碎片里面有嵌套了一个碎片或者是碎片里面有个ViewPager里面嵌套了好多个碎片。在在这样的情况下他先执行的是父碎片的生命周期,当父碎片的onResume方法执行完成之后才会执行子碎片的生命周期。

如果有错误,还请指正,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/174746
推荐阅读
相关标签
  

闽ICP备14008679号