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>
和前面学的 ListView
,GridView
一样,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 与一个页面视图是否是代表的同一个视图 |
范例
我们先来看看最后的效果图
-
创建一个 空的 Android 项目
cn.twle.android.ViewPager
-
修改
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>
-
然后在
res/layout
目录下新添加三个View
布局一式三份,名称分别为
view_one.xml
、view_two.xml
、view_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>
-
然后在
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)); } }
-
然后是修改
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); } }