ViewPager+Fragment的组合主要是为了实现页面滑动功能,并且在开发当中使用的也比较频繁,特此记录一下。
-
适配器的选择
该组合有两个专门用于它们的适配器:FragmentPagerAdapter和FragmentStatePagerAdapter都是继承自PagerAdapter,两者的区别在于前者会保存所有浏览过的Fragment,不会把Fragment的View也保存到内存中,当然为了保证滑动的的流畅当前页面和左右Fragment的View会被保存到内存当中,其余的都会调用onDestroyView方法销毁。后者的区别就是当Fragment对用户不可见的时候,整个Fragment会被销毁(当然,为了保证滑动时流畅,和前者一样,左右两个页面的Fragment会被保留),而不像FragmentPagerAdapter那样,只是销毁Fragment中的View。
使用场景:
当页面较少的时候使用FragmentPagerAdapter不然使用FragmentStatePagerAdapter吧。 -
创建适配器
package com.example.dadao.dadaorobot.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.example.dadao.dadaorobot.until.Logger;
import java.util.List;
public class XFragmentPageAdapter extends FragmentPagerAdapter {
FragmentManager fragmentManager;
List<Fragment> mList;
public XFragmentPageAdapter(FragmentManager fm, List<Fragment>list) {
super(fm);
this.mList=list;
}
@Override
public Fragment getItem(int i) {
Logger.i("getItem当生成Fragment时调用?");
return mList.get(i);
}
@Override
public int getCount() {
return mList.size();
}
}
- 创建Fragment
package com.example.dadao.dadaorobot.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.dadao.dadaorobot.R;
import com.example.dadao.dadaorobot.until.Logger;
public class OneFragment extends Fragment {
public OneFragment() {
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Logger.d("onCreate:------------Fragment创建");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_one, container, false);
Logger.d("onCreateView:------------------View创建");
return view;
}
@Override
public void onResume() {
super.onResume();
Logger.d("onResume");
}
@Override
public void onPause() {
super.onPause();
Logger.d("onPause");
}
@Override
public void onStop() {
super.onStop();
Logger.d("onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Logger.d("onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Logger.d("onDestroy");
}
}
再创建两个这样的Fragment
- 在Activity中的使用
/**
*初始化ViewPager
*/
public void initViewPageFragment() {
fragmentList = new ArrayList<>();
fragmentList.add(new OneFragment());
fragmentList.add(new TwoFragment());
fragmentList.add(new ThreeFragment());
xFragmentPageAdapter = new XFragmentPageAdapter(fragmentManager, fragmentList);
viewPage.setAdapter(xFragmentPageAdapter);
viewPage.setCurrentItem(0);
viewPage.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
// Logger.e("onPageScrolled:" + i + "," + v + "," + i1);
}
@Override
public void onPageSelected(int i) {
Logger.e("当前页码:" + i);
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
}
最后分析一下Fragment在不同情况下的生命周期
- 当前界面为OneFragment时
2018-11-22 15:24:16.073 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 21 | onCreate()]: onCreate:------------Fragment创建
2018-11-22 15:24:16.073 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 22 | onCreate()]: onCreate:-----------Fragment创建
2018-11-22 15:24:16.078 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 28 | onCreateView()]: onCreateView:------------------View创建
2018-11-22 15:24:16.081 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 35 | onStart()]: onStart
2018-11-22 15:24:16.082 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 42 | onResume()]: onResume
2018-11-22 15:24:16.082 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 28 | onCreateView()]: onCreateView:-----------View创建
2018-11-22 15:24:16.087 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 35 | onStart()]: onStart
2018-11-22 15:24:16.087 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 42 | onResume()]: onResume
由Log可见此时不仅会创建OneFragment的View同时还会创建TwoFragment和它的View
- 当界面为TwoFragment时
2018-11-22 17:30:08.421 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 22 | onCreate()]: onCreate:--------------Fragment创建
2018-11-22 17:30:08.423 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 28 | onCreateView()]: onCreateView:----------View创建
2018-11-22 17:30:08.443 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 35 | onStart()]: onStart
2018-11-22 17:30:08.443 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 42 | onResume()]: onResume
可见适配器会自动创建当前界面左右的Fragment和View并保存
- 当界面为ThreeFragment时
2018-11-22 17:33:03.016 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 48 | onPause()]: onPause
2018-11-22 17:33:03.017 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 54 | onStop()]: onStop
2018-11-22 17:33:03.018 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 60 | onDestroyView()]: onDestroyView
会销毁不是与ThreeFragment相邻的OneFragment的View,但是不会销毁Fragment.