<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">ViewPager是谷歌官方提供的一个兼容低版本安卓设备的软件包,里面包括只有在android3.0以上可以使用的API。使用它可以实现导航,页面菜单切换,APP引导页的功能。</span>
使用方式与ListView类似。需要一个适配器,PagerAdapter。
使用步骤:(***表示自己定义文件名)
【1】建立一个项目
【2】布局文件***.xml
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<!--标题、菜单、导航-->
<android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"/>
</android.support.v4.view.ViewPager>
注意:ViewPager和PagerTabStrip必须把包名写全了,否则会产生ClassNotFound;还有PagerTabStrip只能当做ViewPager的子标签来使用。
在PagerTabStrip标签中可以用属性android:layout_gravity="top/bottom"指定导航栏的位置;
如果要显示出PagerTabStrip某一页的title,需要在ViewPager的adapter中实现getPagerTitle(int position)方法。所以我们要定义一个数组去保存title值
【3】***Activity.java中
首先应该想到有以下成员变量
private ViewPager viewPager; //ViewPager组件
private PagerTabStrip pagerTabStrip; //PagerTabStrip组件
private MyPagerAdapter adapter; //ViewPager的适配器
private String[] titles = {"标题一", "标题二", "标题三", "标题四"}; //标题
private ArrayList<View> views = new ArrayList<>(); //每个选项卡对应的布局
其次在onCreate()方法中实例化组件,并初始化选项卡对应的布局
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);
adapter = new MyPagerAdapter();
initViews();
viewPager.setAdapter(adapter);
initViews()方法中就是向链表views添加布局,使用LayoutInflater将布局转化为View对象
private void initViews() {
views.add(getLayoutInflater().inflate(R.layout.viewpager1_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager2_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager3_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager4_layout, null));
}
每个选项卡的布局根据实际情况自己设计,我这里只是有一个ImageView控件显示图片
接下来最重要的步骤之一是自定义MyPagerAdapter去继承PagerAdapter。
//适配器
class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return views.size();
}
//实例化选项卡
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = views.get(position);
container.addView(v);
return v;
}
//删除选项卡
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
//判断当前是否为返回的选项卡对象
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
//获取标题
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
目前先达到会用,适配器具体的工作原理后面再深入研究
补充一个小知识点--》getPageTitle()方法中CharSequence类型; String是java中的字符串,继承于CharSequence。CharSequence是一个接口。它只包括了length(),charAt(int index),subSequence(int start, int end)这几个API接口。
设置了适配器后就可以将标题,以及选项卡对应的布局意义对应起来。如果要实现滑动,还需要实现一个事件接口,在下面就贴出完整版代码吧
package com.example.uitest;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import java.util.ArrayList;
//ViewPager的使用
public class MainActivity extends Activity implements ViewPager.OnPageChangeListener{
private ViewPager viewPager;
private PagerTabStrip pagerTabStrip;
private MyPagerAdapter adapter;
private String[] titles = {"操作一", "操作二", "操作三", "操作四"}; //标题
private ArrayList<View> views = new ArrayList<>(); //每个选项卡对应的布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);
adapter = new MyPagerAdapter();
initViews();
viewPager.setAdapter(adapter);
pagerTabStrip.setTabIndicatorColor(getResources().getColor(android.R.color.holo_blue_bright));//标题栏指示器的颜色
pagerTabStrip.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light)); //标题栏背景颜色
pagerTabStrip.setTextColor(Color.WHITE); //设置标题字体颜色
pagerTabStrip.setTextSize(1, 16); //设置标题字体大小
viewPager.setCurrentItem(1);//设定默认选中的
viewPager.setOnPageChangeListener(this);
}
private void initViews() {
views.add(getLayoutInflater().inflate(R.layout.viewpager1_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager2_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager3_layout, null));
views.add(getLayoutInflater().inflate(R.layout.viewpager4_layout, null));
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Toast.makeText(this, "当前选中的是第"+position+"个页面",Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
//适配器
class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return views.size();
}
//实例化选项卡
@Override
public Object instantiateItem(ViewGroup container, int position) {
View v = views.get(position);
container.addView(v);
return v;
}
//删除选项卡
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
//判断当前是否为返回的选项卡对象
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
//获取标题
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
}