说到fragment,那我肯定要先上个图意思一下了。
ViewPager的简介和作用
ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view
1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。
2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用
viewPager还有个特殊属性 预加载,默认页面切换时,左右两侧相邻的页面会被加载,这样方便用户滑动更流畅。
我们也可以设置预加载页面的数量,系统默认为1。
mViewPagerm.setOffscreenPageLimit(2);
下面来看代码:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_gravity="center"
android:layout_height="0dp">
</android.support.v4.view.ViewPager>
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private List<Fragment> mListm = new ArrayList<>();
private ViewPager mViewPagerm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPagerm = findViewById(R.id.viewpager);
//初始化fragment的实例
Fragment fragment1 = new BlankFragment();
Fragment fragment2 = new BlankFragment1();
Fragment fragment3 = new BlankFragment2();
mListm.add(fragment1);
mListm.add(fragment2);
mListm.add(fragment3);
//为viewpager设置适配器
mViewPagerm.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return mListm.get(position);
}
@Override
public int getCount() {
return mListm.size();
}
});
}
}
这里我们设置的适配器是FragmentPagerAdapter,之后我们会将它和FragmentStatePagerAdapter作比较。
fragment的代码我就不贴了,非常简单。
下面运行代码:
题外话,这里推荐一个手机录制gif的app:https://zhuanlan.zhihu.com/p/32164908
启动时为fragment1,fragment2预加载。
切换到fragment2时,fragment3预加载,此时内存里有fragment1,fragment2,fragment3三个对象实例。
切换到fragment3,因为fragment1和fragment3不是相邻的,viewpager只能预加载左右一个页面,所以fragment1被系统销毁。
如果我们将FragmentPagerAdapter换成FragmentStatePagerAdapter时,fragment1会与主activity解除关联。
所以我们得出结论:
-
FragmentStatePagerAdapter
顾名思义,我们的这个FragmentStatePagerAdapter,在我们切换不同的Fragment的时候,我们会把前面的Fragment销毁,而我们系统在销毁前,会把我们的我们Fragment的Bundle在我们的onSaveInstanceState(Bundle)保存下来。等用户切换回来的时候,我们的Fragment就会根据我们的instance state恢复出来。 -
FragmentPagerAdapter
使用这种Adapter,我们的Fragment在切换的时候,不会销毁,而只是调用事务中的detach方法,这种方法,我们只会把我们的Fragment的view销毁,而保留了以前的Fragment对象。所以通过这种方式创建的Fragment一直不会被销毁。
总结:
讲到这里,相信大家对fragment+viewpager的生命周期有了一定的了解了吧!!!