这几天在研究ViewPager,简单的写一下如何使用ViewPager实现类似于QQ的“最近联系人、好友、群组”的界面切换(不知道他们是不是用这个方法实现的)。
ViewPager已经在android-sdk中加入了,具体的位置在
%android_sdk_home%\android-compatibility\v4
%android_sdk_home%是你的android-sdk-windows目录
好,下面放一张效果图:
步骤一:新建一个工程,我的是Viewpager
步骤二:导入jar包
具体如下:
右键工程--Properties--单击左侧Java Build Path--单击右侧Libraries标签--单击右侧Add External Jars--选择上面描述位置的jar包,保存
步骤三:编写一个主界面,加入android.support.v4.view.ViewPager组件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <android.support.v4.view.ViewPager android:id="@+id/mViewPager" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
界面都很简单,随便写的
界面1
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff0000" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout1" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00ff00" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout2" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#0000ff" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="layout3" /> </LinearLayout>
package com.carter.viewpager; import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import android.app.Activity; import android.app.ActivityGroup; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ViewpagerActivity extends ActivityGroup { /** * 能够支持滑动的组件 */ ViewPager mViewPager; /** * ViewPager 需要设置该Adapter才能实现添加界面, * 该Adapter继承自PagerAdapter */ MyPagerAdapter adapter; /** * 用于保存三个界面 */ List<View> list; /** * 用于生成界面 */ LayoutInflater mInflater; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mInflater = this.getLayoutInflater(); /** * 添加进来三个界面到List,用于初始化PagerAdapter */ list = new ArrayList<View>(); list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); list.add(mInflater.inflate(R.layout.layout2, null)); list.add(mInflater.inflate(R.layout.layout3, null)); mViewPager = (ViewPager)findViewById(R.id.mViewPager); adapter = new MyPagerAdapter(list); mViewPager.setAdapter(adapter); /** * 为ViewPager添加PageChangeListener,在回调的方法中可以完成其他的事情,例如处理一些界面标签的转换之类的,如果你有标签栏的话 */ mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub Log.i("carter", "onPageSelected"); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } class MyPagerAdapter extends PagerAdapter { List<View> mList; public MyPagerAdapter(List<View> list){ mList = list; } @Override public int getCount() { // TODO Auto-generated method stub return mList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == (arg1); } @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub ((ViewPager)container).removeView(mList.get(position)); } @Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(mList.get(position), 0); return mList.get(position); } @Override public void finishUpdate(ViewGroup container) { // TODO Auto-generated method stub super.finishUpdate(container); } } }
1、在上面重写了PagerAdapter,在里面最重要的方法就是
@Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(mList.get(position), 0); return mList.get(position); }具体为什么每次都是addView到0的位置,目前我还不知道,这个也是从网上找了一个方法看到的。
2、在初始化List的时候,里面包含的内容是一个个的View元素,在我的了解范围内有两种方法
第一种就是通过添加Window的getDecorView()来得到一个View
第二种就是通过LayoutInflater,从xml中生成一个View
需要注意的是,第一种方法,需要主类继承自ActivityGroup,这样才能在添加时使用getLocalActivityManager以及之后的方法,需要生成的Activity,例如本例中的Layout1Activity,要在AndroidManifest.xml中声明。
/** * 添加进来三个界面到List,用于初始化PagerAdapter */ list = new ArrayList<View>(); list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); list.add(mInflater.inflate(R.layout.layout2, null)); list.add(mInflater.inflate(R.layout.layout3, null));
3、如果只是从xml生成View来添加的话,完全可以移除继承ActivityGroup。
4、如果使用startActivity的方法来启动,需要添加进来的几个Activity,是一起在加入时就初始化的,可以通过在onCreate()方法中打LOG看出来。