ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期

下面要做的效果图下图

ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期_第1张图片

首先我们创建一个适配器如下

public class FraPagerAdapter extends FragmentPagerAdapter {
    private List mlist;

    public FraPagerAdapter(@NonNull FragmentManager fm, int behavior, List list) {
        super(fm, behavior);
        this.mlist = list;
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem(container, position, object);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mlist.get(position);
    }

    @Override
    public int getCount() {
        return mlist.size();
    }
}

 

记得之前有人问过为什么FragmentPagerAdapter 里面没有使用destoryitem 这个是因为FragmentPagerAdapter 源码里面写过了

activity 界面

public class ViewPagerActivity extends AppCompatActivity implements View.OnClickListener {
    private List list;
    private ViewPager myViewPager;
    private FraPagerAdapter adapter;

    private TextView hp_text;
    private TextView film_text;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager_activity_layout);
        initView();
    }


    private void initView() {
        hp_text = findViewById(R.id.hp_text);
        hp_text.setOnClickListener(this);
        film_text = findViewById(R.id.film_text);
        film_text.setOnClickListener(this);

        myViewPager = findViewById(R.id.myViewPager);
        //绑定点击事件
        myViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        hp_text.setTextColor(Color.RED);
                        film_text.setTextColor(Color.BLACK);
                        break;
                    case 1:
                        hp_text.setTextColor(Color.BLACK);
                        film_text.setTextColor(Color.RED);
                        break;


                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        // 把Fragment添加到List集合里面
        list = new ArrayList<>();
        list.add(new HpFragment());
        list.add(new FilmFragment());
        adapter = new FraPagerAdapter(getSupportFragmentManager(),
                FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, list);
        myViewPager.setAdapter(adapter);
        myViewPager.setCurrentItem(0);  // 初始化显示第一个页面


    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.hp_text:
                myViewPager.setCurrentItem(0);
                break;
            case R.id.film_text:
                myViewPager.setCurrentItem(1);
                break;
        }
    }
}

这样实现了上面gif图的效果

当我们第一次进来的时候2个Fragment 的生命周期如下图

ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期_第2张图片

可以看到2个Fragment的生命周期

下面是ViewPager 设置1个缓存的时候:

HpFragment:onAttach-->onCreate-->onCreateView-->onActivityCreated-->onStart-->onResume

FilmFragment:onAttach-->onCreate-->onCreateView-->onCreateView-->onStart  少走一步onResume

HpFragment从onAttach 走到onResume,第二个Fragment 会走的原因是viewpager默认的缓存为1

如果有3个Fragment 当第二个切换到第三个的时候,第一个Fragment的生命周期

为:onStop-->onDestroyView,第二个Fragment 的生命周期为 onPause ,当然由于缓存问题第三个的就直接走onResume

 

demo 地址

你可能感兴趣的:(Android,知识点记录)