Android笔记之ViewPager使用

说明:1、ViewPager+Fragment组合为google推荐方式,比TabActivity+Activity的效率高的多

           2、本文主要介绍如何利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果,不涉及Tabost

           3、当滑到title3时,title1的界面被重置,不知怎么解决

一、主布局文件activity_main.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: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" >

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

</LinearLayout>

(1)ViewPager用来管理layout并可以左右滑动显示各个页面数据,PagerTabStrip用来显示页面title

(2)android:layout_gravity="top"表示title在顶部,可设置bottom等。

二.1、主Activity代码

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity {
    /** 多个fragment的list **/
    List<Fragment> fragmentList = new ArrayList<Fragment>();
    /** 多个String的list **/
    List<String>   titleList    = new ArrayList<String>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ViewPager vp = (ViewPager)findViewById(R.id.viewPager);
        
        fragmentList.add(new ViewPagerFragment(R.layout.lay1));
        fragmentList.add(new ViewPagerFragment(R.layout.lay2));
        fragmentList.add(new ViewPagerFragment(R.layout.lay3));
//ViewPagerFragment是自己新建的继承Fragment的类,用来根据参数xml文件的id来返回一个view titleList.add(
"title 1 "); titleList.add("title 2 "); titleList.add("title 3 "); vp.setAdapter(new myPagerAdapter(getSupportFragmentManager(), fragmentList, titleList));
        //将括号的内容为ViewPagerFragmen适配 }
/** * 定义ViewPager的适配器:新建类,并创建构造函数接收参数,构造函数在每次新建该类(例如new)都会背调用*/ class myPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; private List<String> titleList; public myPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList){ super(fm); this.fragmentList = fragmentList;
            //this.fragmentList为这个类下的变量,右边的fragmentList是构造函数的参数
this.titleList = titleList; } /** * 函数getItem根据int参数返回一个fragment,即一个View,作为当前页面 */ @Override public Fragment getItem(int arg0) { return (fragmentList == null || fragmentList.size() == 0) ? null : fragmentList.get(arg0);
             //如果fragmentList为空或者size为0,则返回null,否则返回fragmentList中id为arg0的fragment }
/** *函数getPageTitle根据int参数返回一个Stringt,作为当前标题 */ @Override public CharSequence getPageTitle(int position) { return (titleList.size() > position) ? titleList.get(position) : ""; } /** * 函数getCount自动返回一个int,即为fragmentList的元素个数,相当与数组的length */ @Override public int getCount() { return fragmentList == null ? 0 : fragmentList.size(); } } }

(1)上面fragmentList.add(new ViewPagerFragment(R.layout.lay1))的部分相当于

fragmentList.add(new fragment1());//fragment1是extends Fragment的类
fragmentList.add(new fragment2());
fragmentList.add(new fragment3());

2、创建ViewPagerFragment以根据layout的布局文件返回View作为不同页面的fragment

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class ViewPagerFragment1 extends Fragment {
     private int  lay;
     private TextView tv = null;
     //构造函数,layId为R.layout.lay1之类的
     public ViewPagerFragment1(int layId){
            super();
            this.lay = layId;
            }
    /**
     * 覆盖此函数,先通过inflater inflate函数得到view最后返回
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(lay, container, false);
        return v;
    }
}
原文地址:https://www.cnblogs.com/xingyyy/p/3278867.html