Fragment生命周期新认识

文章内容也许与标题并不是很相符,我主要想写的只是在项目中遇到的一些小问题以及问题的是如何解决,至于写这个标题只是因为这些错误是由于对Fragment的生命周期理解不够深刻而导致的。

为了便于分析,贴出有问题和解决问题后的代码(只是一些关键代码):

有问题:

     代码段1:

dots.get(0).setBackgroundResource( R.drawable.dot_focused);

代码段2:

mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { dots.get(oldPosition % viewList.size()).setBackgroundResource( R.drawable.dot_normal); dots.get(position % viewList.size()).setBackgroundResource( R.drawable.dot_focused); oldPosition = position; }

代码段3:

viewList.add(view1); viewList.add(view2); viewList.add(view3); viewList.add(view4); viewList.add(view5);

问题解决后:

代码1:

dots.get(currentItem % viewList.size()).setBackgroundResource( R.drawable.dot_focused);

代码2:

mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { if (viewList != null && viewList.size() > 0) { dots.get(oldPosition % viewList.size()) .setBackgroundResource(R.drawable.dot_normal); dots.get(position % viewList.size()).setBackgroundResource( R.drawable.dot_focused); } oldPosition = position; currentItem = position; }

代码4:

@Override public void onDestroyView() { super.onDestroyView(); viewList.clear(); mViewPager.stopImageTimerTask(); }

     代码1和2都写在onCreateView(),接下来描述下产生的问题。

问题一

主界面是个带底部标签栏的界面实现方法是FragmentActivity+Fragment,其中第一个Fragment中有一个ViewPager,产生的问题是当切换到第二个标签页后再切回到带有ViewPager的标签页时,第一个小圆点会一直处于选中状态。

问题就出在代码1中,因为每次切换页签后,Fragment的onCreateView()都会得到执行,我一开始只是dots.get(0),所以小圆点会一直选中第一个。只需要改成dots.get(currentItem%viewList.size())问题就解决了。(currentItem为当前页,viewList为ViewPager资源集合)。

问题二:

当切换到第二个标签页后再切回到带有ViewPager的标签页时,ViewPager轮播到最后一张图片再向第一张图片轮播时

程序崩溃(ViewPager是无限自动轮播的),报index越界的错误。之前没有进行页签切换时并没有发生这个错误ViewPager

能顺利的一直自动轮播,但是进行页签切换后却报错了。后来打印viewList的size发现,viewList的size居然变成了10!

但是我原来只放了5张图片。

究其原因错误就是发生在代码段3(写在onCreateView()中),切换页签再切换回来时,Fragment的onCreateView()又得

执行,所以又往viewList集合中添加了5个view,导致viewList的size变为了10,解决办法是当切换页签时Fragment的

onPause(),onStop(),onDestroyView()会得到执行,所以我在onDestroyView()中先将viewList清空了,这样就不会有

viewList长度变化而导致的错误了。

问题三:

前面两个问题解决了,心里也舒了一口气,但是运行的时候还是有地方不爽,就是切换回来后,ViewPager会先跳到

一页,然后按原来的顺序继续轮播(比如我切换前图片播到了第4页,等切换回来后图片会先跳转到第3页后,有跳到第

5页继续按顺序轮播)。检测前后代码发现是因为当切换到别的页签时,图片还是继续在轮播,导致它会有一个不协调

的跳转,所以我的处理办法是在onDestroyView()中将自动轮播停止了。如何实现自动轮播的开始和停止可以参考我上

一篇ViewPager无限自动轮播+动画

结语:

记录这篇文章更主要的目的是为了给自己总结,同时也希望能够为遇到类似问题同是android路上刚刚启程的新手的一

些微薄的帮助。(也许很少会有人犯这样的问题),但是我还希望把它记录下来,作为我android学习路上的一道风景。


你可能感兴趣的:(android,viewpager,生命周期,Fragment)