ViewPager实现导航
标签(空格分隔): Android ViewPager
1. PagerAdapter使用
- 加入ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
</android.support.v4.view.ViewPager>
- 加载显示的页卡
将Layout布局转换成View对象
1. LayoutInflater lf=getLayoutInflater().from(this);
lf.inflate(resource,root);
2. View.inflate(context,resource,root);
配置适配器
- PagerAdapter 数据源:List< View >
- FragmentPagerAdapter 数据源:List< Fragment >
- FragmentStatePagerAdapter 数据源:List< Fragment >
Adapter里面的的常用方法
- getCount() 返回所有页面数量
- isViewFromObject(View view,Object o) 判断视图是否由对象产生
- instantiateItem(ViewGroup container,int position) 实例化界面
- destroyItem(ViewGroup container,int position,Object object) 销毁页面
- getPageTitle(int position) 返回页面标题信息
activity_view_pager.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/pager"
android:layout_gravity="center">
<android.support.v4.view.PagerTabStrip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tab"
android:layout_gravity="top"/>
<android.support.v4.view.PagerTitleStrip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:layout_gravity="bottom"/>
</android.support.v4.view.ViewPager>
</LinearLayout>
注意:PagerTabStrip和PagerTitleStrip作为标题二者选其一即可,后者会覆盖前者。
MyPagerAdapter.java:
package com.excavator.viewpagerdemo;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
/**
* 项目名称:AdvancedControlTest
* 类描述:
* 创建人:admin
* 创建时间:2015/6/24 17:02
* 修改人:admin
* 修改时间:2015/6/24 17:02
* 修改备注:
*/
public class MyPagerAdapter extends PagerAdapter {
private List<View> mViewList;
private List<String> mTitleList;
public MyPagerAdapter(List<View> viewList, List<String> titleList) {
mViewList = viewList;
mTitleList = titleList;
}
/**
* 返回页卡的数量
* @return
*/
@Override
public int getCount() {
return mViewList.size();
}
/**
* View是否来自于对象
* @param view
* @param object
* @return 布尔值
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
/**
* 实例化一个页卡
* @param container
* @param position
* @return
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
return mViewList.get(position);
}
/**
* 销毁一个页卡
* @param container
* @param position
* @param object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
//设置ViewPager页卡的标题
@Override
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);
}
}
MyViewPagerActivity.java
package com.excavator.viewpagerdemo;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.View;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ViewPagerActivity extends Activity {
private List<View> mViewList;
private ViewPager mViewPager;
private PagerTabStrip mTabStrip;
private List<String> mTitleList;
private List<Fragment> mFragList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
mViewList = new ArrayList<>();
/**
* 通过View对象去作为ViewPager数据源
*/
View view1 = View.inflate(this, R.layout.view1, null);
View view2 = View.inflate(this, R.layout.view2, null);
View view3 = View.inflate(this, R.layout.view3, null);
View view4 = View.inflate(this, R.layout.view4, null);
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
mViewList.add(view4);
/**
* 通过Fragment作为ViewPager的数据源
*/
mFragList = new ArrayList<>();
mFragList.add(new Fragment1());
mFragList.add(new Fragment2());
mFragList.add(new Fragment3());
mFragList.add(new Fragment4());
//为ViewPager页卡设置标题
String[] titleNames = new String[]{"第一页", "第二页", "第三页", "第四页"};
mTitleList = new ArrayList<>();
Collections.addAll(mTitleList, titleNames);
//为PagerTabStrip设置一些属性
mTabStrip = (PagerTabStrip) findViewById(R.id.tab);
mTabStrip.setBackgroundColor(Color.YELLOW);
mTabStrip.setTextColor(Color.RED);
mTabStrip.setDrawFullUnderline(false);
mTabStrip.setTabIndicatorColor(Color.GREEN);
//初始化ViewPager
mViewPager = (ViewPager) findViewById(R.id.pager);
//创建PagerAdapter
MyPagerAdapter adapter = new MyPagerAdapter(mViewList,mTitleList);
//ViewPager加载适配器
mViewPager.setAdapter(adapter);
}
}
2. FragmentPagerAdapter使用
ViewPagerActivity.java
package com.excavator.viewpagerdemo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ViewPagerActivity extends FragmentActivity implements ViewPager.OnPageChangeListener {
private List<View> mViewList;
private ViewPager mViewPager;
private PagerTabStrip mTabStrip;
private List<String> mTitleList;
private List<Fragment> mFragList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
mViewList = new ArrayList<>();
/**
* 通过View对象去作为ViewPager数据源
*/
View view1 = View.inflate(this, R.layout.view1, null);
View view2 = View.inflate(this, R.layout.view2, null);
View view3 = View.inflate(this, R.layout.view3, null);
View view4 = View.inflate(this, R.layout.view4, null);
mViewList.add(view1);
mViewList.add(view2);
mViewList.add(view3);
mViewList.add(view4);
/**
* 通过Fragment作为ViewPager的数据源
*/
mFragList = new ArrayList<>();
mFragList.add(new Fragment1());
mFragList.add(new Fragment2());
mFragList.add(new Fragment3());
mFragList.add(new Fragment4());
//为ViewPager页卡设置标题
String[] titleNames = new String[]{"微信", "通讯录", "发现", "我"};
mTitleList = new ArrayList<>();
Collections.addAll(mTitleList, titleNames);
//为PagerTabStrip设置一些属性
mTabStrip = (PagerTabStrip) findViewById(R.id.tab);
mTabStrip.setBackgroundColor(Color.YELLOW);
mTabStrip.setTextColor(Color.RED);
mTabStrip.setDrawFullUnderline(false);
mTabStrip.setTabIndicatorColor(Color.GREEN);
//初始化ViewPager
mViewPager = (ViewPager) findViewById(R.id.pager);
//创建PagerAdapter
// MyPagerAdapter adapter = new MyPagerAdapter(mViewList,mTitleList);
//ViewPager加载适配器
// mViewPager.setAdapter(adapter);
//创建FragmentPagerAdapter
// MyFragmentPagerAdapter adapter2 = new MyFragmentPagerAdapter(getSupportFragmentManager(),mFragList,mTitleList);
// mViewPager.setAdapter(adapter2);
MyFragmentPagerAdapter2 adapter3 = new MyFragmentPagerAdapter2(getSupportFragmentManager(),mFragList,mTitleList);
mViewPager.setAdapter(adapter3);
mViewPager.addOnPageChangeListener(this);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Toast.makeText(this,"当前是第"+(position+1)+"个页面",Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
注意:向下兼容Fragment时,即import android.support.v4.app.Fragment Activity应该继承自FragmentActivity,并且使用getSupportFragmentManager()方法获取管理者。
Fragment1.java
package com.excavator.viewpagerdemo;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class Fragment1 extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.view1, container, false);
}
}
Fragment2.java
package com.excavator.viewpagerdemo;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class Fragment2 extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.view2, container, false);
}
}
Fragment3.java
package com.excavator.viewpagerdemo;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class Fragment3 extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.view3, container, false);
}
}
Fragment4.java
package com.excavator.viewpagerdemo;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class Fragment4 extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.view4, container, false);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Main1","我销毁了");
}
}
注意:由于更换了手机,打印日志时,无法输出调试信息时,是由于手机没有打开离线日志输出,更改日志输出级别,大神F1手机 在拨号界面输入*20121220#进入工程模式,更改Java log level和C and C++ log level为LOGV,将Kernel log level输出等级设置为最后的KERN_DEBUG
MyFragmentPagerAdapter.java
package com.excavator.viewpagerdemo;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* 项目名称:AdvancedControlTest
* 类描述:FragmentPagerAdapter会把所有的Fragment界面全部加载,不会有自动加载和销毁页卡方法
* 创建人:admin
* 创建时间:2015/6/24 21:26
* 修改人:admin
* 修改时间:2015/6/24 21:26
* 修改备注:
*/
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mFragList;
private List<String> mTitleList;
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragList, List<String> titleList) {
super(fm);
mFragList = fragList;
mTitleList = titleList;
}
@Override
public Fragment getItem(int position) {
return mFragList.get(position);
}
@Override
public int getCount() {
return mFragList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);
}
}
MyFragmentPagerAdapter继承自FragmentPagerAdapter会把所有Fragment界面全部加载,不会调用加载和销毁页卡方法。
MyFragmentPagerAdapter2.java
package com.excavator.viewpagerdemo;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.util.Log;
import android.view.ViewGroup;
import java.util.List;
/**
* 项目名称:AdvancedControlTest
* 类描述:FragmentStatePagerAdapter会把所有的Fragment界面全部加载,会调用自动加载和销毁页卡方法
* 创建人:admin
* 创建时间:2015/6/24 21:26
* 修改人:admin
* 修改时间:2015/6/24 21:26
* 修改备注:
*/
public class MyFragmentPagerAdapter2 extends FragmentStatePagerAdapter {
private List<Fragment> mFragList;
private List<String> mTitleList;
public MyFragmentPagerAdapter2(FragmentManager fm, List<Fragment> fragList, List<String> titleList) {
super(fm);
Log.d("Main1","abc");
mFragList = fragList;
mTitleList = titleList;
}
@Override
public Fragment getItem(int position) {
return mFragList.get(position);
}
@Override
public int getCount() {
return mFragList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
}
MyFragmentPagerAdapter2继承自FragmentStatePagerAdapter会调用加载和销毁页卡方法。
3. 监听器的使用
使类实现OnPageChangeListene接口,
mViewPager.addOnPageChangeListener(this);
并重写以下方法
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Toast.makeText(this,"当前是第"+(position+1)+"个页面",Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrollStateChanged(int state) {
}
本文介绍如何使用ViewPager组件在Android应用中实现导航功能,包括PagerAdapter、FragmentPagerAdapter及FragmentStatePagerAdapter的使用方法,以及如何添加监听器来响应页面变化。
276

被折叠的 条评论
为什么被折叠?



