ViewPager在v4包中,所以布局文件应该这么写:
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000" >
</android.support.v4.view.ViewPager>
ViewPager的功能就是可以使视图滑动,用途主要有:首次启动应用的引导页,以及滑动的Tab界面设计。要注意的是,上面一段代码只是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。 这个和ListView很像。
过程分3步:
第1步,创建一个View的List集合。
第2步,使用ViewAdapter装载这个集合。
第3步,给ViewPager设置ViewAdapter。
//第1步,创建一个View的集合,并动态加载n个View,添加进集合
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.guideone, null));
views.add(inflater.inflate(R.layout.guidetwo, null));
views.add(inflater.inflate(R.layout.guidethree, null));
//第2步,为ViewAdapter装载这个集合
vpAdapter = new ViewPagerAdapter(views, this);
//第3步,给ViewPager设置ViewAdapter
vp= (ViewPager) findViewById(R.id.view_pager);
vp.setAdapter(vpAdapter);
此处我新创建的一个ViewPagerAdapter类继承自PaperAdapter,当然也可以直接new一个PagerAdapter。其中的内容也是分3个部分:
第1部分:构造函数
第2部分:加载、销毁View的方法
第3部分:自动生成的两个有返回值的方法
public class ViewPagerAdapter extends PagerAdapter {
//创建两个变量,并作为参数传入构造方法
private List<View> views ;
private Context context;
public ViewPagerAdapter(List<View> views, Context context) {
super();
this.views = views;
this.context = context;
}
//不要的时候,销毁View的方法,根据position进行索引,并制定View为ViewPager
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(views.get(position));
}
//加载View的方法,类似于AdapterView中的getView方法
@Override
public Object instantiateItem(ViewGroup container, int position) {
//添加页卡(遍历View这个集合,加载所有View作为页卡)
View view =views.get(position);
container.addView(view);
return view;
}
//直接返回View集合的大小即可
@Override
public int getCount() {
return views.size();
}
//判断当前的View是否是我们需要的对象
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 ==arg1);
}
}
下面是一个引导页的实例:
代码除了上面创建的ViewAdapter子类外,还有3个activity分别为:主页面,欢迎页面,引导页页面。
这里的ImageView 实例和 ImageView的id都使用了数组,一般而言ViewPager不会太多,也可以不用数组。
public class Guide extends Activity implements OnPageChangeListener{
private ViewPager vp;
private ViewPagerAdapter vpAdapter;
private List<View> views;
private ImageView [] dots;
private int [] ids = {R.id.iv1,R.id.iv2,R.id.iv3};
private Button start_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.guide);
initViews();
initDots();
}
//初始化方法中,先给ViewAdapter添加内容(就是3个View),然后给ViewPager设置ViewAdatper,最后添加监听事件回调方法
private void initViews() {
LayoutInflater inflater = LayoutInflater.from(this);
views = new ArrayList<View>();
views.add(inflater.inflate(R.layout.guideone, null));
views.add(inflater.inflate(R.layout.guidetwo, null));
views.add(inflater.inflate(R.layout.guidethree, null));
vpAdapter = new ViewPagerAdapter(views, this);
vp= (ViewPager) findViewById(R.id.view_pager);
vp.setAdapter(vpAdapter);
//严重注意此处的Button不在我们的布局当中,当前的布局是guide,Button存在于集合中,所以要使用get,取得元素,和getChild是有区别的,不然会有空指针异常
start_btn = (Button) views.get(2).findViewById(R.id.start_btn);
start_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Guide.this, MainActivity.class);
startActivity(intent);
//这个finish必须写上,不然后退回Guide界面就太丑了
finish();
}
});
vp.setOnPageChangeListener(this);
}
//初始化dots方法中,找到了每一个dots的对象,相当于一个个find出来,但对于大型数据用两个数组的方式更好
private void initDots(){
dots = new ImageView[views.size()];
for(int i =0; i<views.size(); i++){
dots[i]= (ImageView) findViewById(ids[i]);
}
}
//当前页面被选中时调用
@Override
public void onPageSelected(int arg0) {
for(int i =0; i< ids.length; i++){
if (arg0 ==i){
dots[i].setImageResource(R.drawable.login_point_selected);
}else{
dots[i].setImageResource(R.drawable.login_point);
}
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
public class Welcome extends Activity {
private boolean isFirstIn =false;
private static final int Time =2000;
private static final int Go_Home= 1000;
private static final int Go_Guide= 1001;
//在主线程中做 延时操作是不合理的,可以使用handler
Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case Go_Home:
go_Home();
break;
case Go_Guide:
go_Guide();
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.welcome);
init();
}
private void init() {
SharedPreferences preferences = getSharedPreferences("suibianqu", MODE_PRIVATE);
//先去取isFirstI的值,如果没有,表明是第一次取,第一次取肯定是true
isFirstIn = preferences.getBoolean("isFirstIn", true);
//通过isFirstIn选择启动哪个页面,再将新boolean值存入SharedPreferences
if(isFirstIn){
mHandler.sendEmptyMessageDelayed(Go_Guide, Time); //制定多少毫秒后发送空消息,第一个参数是一个int what值
Editor editor = preferences.edit();
editor.putBoolean("isFirstIn", false);
editor.commit();
}else{
mHandler.sendEmptyMessageDelayed(Go_Home, Time);
}
}
private void go_Home(){
Intent intent = new Intent(Welcome.this, MainActivity.class);
startActivity(intent);
finish(); //用了finish,就不能后退回welcome页面了, onActivityResult()也不能使用
}
private void go_Guide(){
Intent intent = new Intent(Welcome.this, Guide.class);
startActivity(intent);
finish();
}
}