Android ViewPager (页面切换组件)

Android ViewPager(页面切换组件) 可以通过手势滑动可以完成 View 的切换,一般是用来做 APP 的引导页或者实现图片轮播

我们可以往里面填充多个 View,通过左右滑动实现切换不同的 View


ViewPaper

ViewPaper 可以使用 XML 代码创建

<android.support.v4.view.ViewPager
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <android.support.v4.view.PagerTitleStrip
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_gravity="top" />

</android.support.v4.view.ViewPager>

和前面学的 ListViewGridView 一样,ViewPaper 也需要一个特定 Adapter 将 View 和 ViewPager 进行绑定

这个特定的 Adapter 就是 PagerAdapter

Android 官方推荐使用 Fragment 来填充 ViewPager 的,这样 可以更加方便的生成每个 Page,以及管理每个 Page 的生命周期

它同时提供了 Fragment 专用的 Adapter

Adapter 说明
FragmentPageAdapter 只会缓存当前的 Fragment 以及左边一个,右边一个,即总共会缓存3个Fragment而已,其它的则会被销毁
FragmentStatePagerAdapter 当 Fragment 不可见时,整个 Fragment 会被销毁,只会保存 Fragment 的状态。而在页面需要重新显示的时候,会生成新的页面

所以, FragmentPageAdapter 适合固定的页面较少的场合;而 FragmentStatePagerAdapter 则适合 于页面较多或者页面内容非常复杂(需占用大量内存)的情况

PagerAdapter

PaperAdapter 是一个虚类 (abstract),所以不能直接使用,而是要创建子类然后重写下面四个方法

方法 说明
getCount() 获得 viewpager 中有多少个 view
destroyItem() 移除一个给定位置的 view, 用于确保在 finishUpdate(viewGroup)返回时视图能够被移除
instantiateItem() 将给定位置的 view 添加到 ViewGroup(容器)中,创建并显示出来
返回一个代表新增页面的 Object(key),通常都是直接返回 view 本身就可以了
isViewFromObject() 判断 instantiateItem(ViewGroup, int)函数所返回来的 Key 与一个页面视图是否是代表的同一个视图

范例

我们先来看看最后的效果图


  1. 创建一个 空的 Android 项目 cn.twle.android.ViewPager

  2. 修改 activity_main.xml 添加一个 按钮 ( Button )

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    
    </LinearLayout>
    
  3. 然后在 res/layout 目录下新添加三个 View 布局

    一式三份,名称分别为 view_one.xmlview_two.xmlview_three.xml

    view_one.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff9ff3"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Page One"
            android:textColor="#ffffff" />
    </LinearLayout>
    

    view_two.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00d2d3"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Page Two"
            android:textColor="#ffffff" />
    </LinearLayout>
    

    view_three.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#5f27cd"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Page Three"
            android:textColor="#ffffff" />
    </LinearLayout>
    
  4. 然后在 MainActivity.java 目录下定义一个 PageAdapter 是子类 MsPagerAdapter.java

    package cn.twle.android.viewpager;
    
    import android.support.v4.view.PagerAdapter;
    
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.ArrayList;
    
    public class MsPagerAdapter extends PagerAdapter {
    
        private ArrayList<View> mData;
    
        public MsPagerAdapter() {
        }
    
        public MsPagerAdapter(ArrayList<View> view_list) {
            super();
            this.mData = view_list;
        }
    
        @Override
        public int getCount() {
            return mData.size();
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(mData.get(position));
            return mData.get(position);
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(mData.get(position));
        }
    }
    
  5. 然后是修改 MainActivity.java 添加 ViewPaper

    package cn.twle.android.viewpager;
    
    import android.os.Bundle;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ViewPager viewpaper = (ViewPager) findViewById(R.id.viewpager);
    
            ArrayList<View> view_list = new ArrayList<View>();
    
            LayoutInflater li = getLayoutInflater();
    
            view_list.add(li.inflate(R.layout.view_one,null,false));
            view_list.add(li.inflate(R.layout.view_two,null,false));
            view_list.add(li.inflate(R.layout.view_three,null,false));
    
            MsPagerAdapter mAdapter =  new MsPagerAdapter(view_list);
    
            viewpaper.setAdapter(mAdapter);
        }
    }
    

参考文档

  1. Android ViewPager

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.