赞
踩
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;
}
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() {
......
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();
}
3,就在父碎片 中用子碎片的对象 调用他的setData方法,报了空指针,经过一系列的研究和请教 才发现在父碎片的生命周期的onResume方法执行完之后才会开始执行子碎片的生命周期,也就是说不能再onResume方法中调用自碎片的方法,因为在这个时候子碎片的生命周期还没用执行。所以子碎片没有被初始化,会报错,
4,解决的办法
@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();
}
总结一下就是 :当一个碎片里面有嵌套了一个碎片或者是碎片里面有个ViewPager里面嵌套了好多个碎片。在在这样的情况下他先执行的是父碎片的生命周期,当父碎片的onResume方法执行完成之后才会执行子碎片的生命周期。
如果有错误,还请指正,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。