说明: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; } }