Android App中使用ViewPager+Fragment实现滑动切换效果
在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar、细节无法控制。不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包。那我们就也采用viewpager来做滑动吧。另外一个概念就是Fragment和FragmentActivity,Fragment是一个特殊的类,有着和activity一致的生命周期和view一致的界面,也就是Fragment就等于具有生命周期的View,但是,要注意的是:Fragment并不是View,它和View没有继承关系。使用Fragment的好处是:Fragment可以重用,而且每个Fragment可以在内部处理自己的业务就像activity一样,这样模块间耦合较低,比把所有的业务都写在一个activity内部逻辑要清晰很多。还有就是,由于每个模块的业务都在Fragment内部来实现,这样activity只要管理好几个Fragment就行了,不需要做和业务相关的事情,最后,Fragment可以用来做不同分辨率机型的适配。Fragment在sdk(android 3.0及更高)和android-support-v4里面都有,但是由于兼容性的问题,我们只能使用android-support-v4里面的Fragment,除非你想你的apk只跑在3.0以后的android手机上,FragmentActivity的情况和Fragment类似。关于Fragment和FragmentActivity,其实有一些基本的用法需要了解一下,但是考虑到Fragment不是本文的重点,所以这里就不介绍了,另外,本文只用Fragment做了一个简单的界面,大家应该一看就懂,好了,言归正传。
ViewPager + Fragment 经常用到 代码是从 actionbarsherlock 中提取出来的,这个效果都知道是 滑动来切换的。直接上代码了
在这里简单说明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter
2个adapter:
第一种 fragment状态adapter - 在当前只会存在 前1个fragment 当前 fragment 和 下1个 fragment 其他销毁 ,适合加载多数据;
第二种 FragmentPagerAdapter - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。
工程结构:
1.activity adapter 在一起 (static类型的 Fragment)
public class ViewPageFragment extends FragmentActivity { //这个是有多少个 fragment页面 static final int NUM_ITEMS = 5; private MyAdapter mAdapter; private ViewPager mPager; private int nowPage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pagers_fragment_main); mAdapter = new MyAdapter(getSupportFragmentManager() ); mPager = (ViewPager)findViewById(R.id.mypagers_pager); mPager.setAdapter(mAdapter); } /** * 有状态的 ,只会有前3个存在 其他销毁, 前1个, 中间, 下一个 */ public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } //得到每个item @Override public Fragment getItem(int position) { return ArrayFragment.newInstance(position); } // 初始化每个页卡选项 @Override public Object instantiateItem(ViewGroup arg0, int arg1) { // TODO Auto-generated method stub return super.instantiateItem(arg0, arg1); } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println( "position Destory" + position); super.destroyItem(container, position, object); } } /** * 无状态的 会全部加载着, 这个适合少量的 特别多的图片啊啥的 还是用 FragmentStatePagerAdapter * @author lilei */ // public static class MyAdapter extends FragmentPagerAdapter { // public MyAdapter(FragmentManager fm ) { // super(fm); // // } // // @Override // public int getCount() { // return NUM_ITEMS; // } // // @Override // public Fragment getItem(int position) { // // 返回相应的 fragment // return ArrayFragment.newInstance(position); // } // // @Override // public void destroyItem(ViewGroup container, int position, Object object) { // System.out.println( "position Destory" + position); // super.destroyItem(container, position, object); // } // } /** * 所有的 每个Fragment */ public static class ArrayFragment extends Fragment { int mNum; static ArrayFragment newInstance(int num) { ArrayFragment array= new ArrayFragment(); Bundle args = new Bundle(); args.putInt("num", num); array.setArguments(args); return array; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNum = getArguments() != null ? getArguments().getInt("num") : 1; System.out.println("mNum Fragment create ="+ mNum); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("onCreateView = "); //在这里加载每个 fragment的显示的 View View v = null; if(mNum == 0){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else if(mNum == 1){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else if(mNum == 2){ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); }else{ v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum"); } return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { System.out.println("onActivityCreated = "); super.onActivityCreated(savedInstanceState); } @Override public void onDestroyView(){ System.out.println(mNum + "mNumDestory"); super.onDestroyView(); } @Override public void onDestroy(){ super.onDestroy(); } } }
2. 和 1也没什么太大区别( 个中用处 看个人了 )
public class ViewPageFragmentCS extends FragmentActivity { //这个是有多少个 fragment页面 private MyAdapter mAdapter; private ViewPager mPager; private List<Entity> list = new ArrayList<ViewPageFragmentCS.Entity>();; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pagers_fragment_main); for (int i = 0; i < 7 ; i++) { Entity ee = new Entity(); ee.name = "ll"+ i; ee.age = ""+ i; list.add(ee); } mAdapter = new MyAdapter(getSupportFragmentManager(),list); mPager = (ViewPager)findViewById(R.id.mypagers_pager); mPager.setAdapter(mAdapter); } private class Entity{ public String name; public String age; } // 在这里你可以传 list<Fragment> 也可以传递 list<Object>数据 public class MyAdapter extends FragmentStatePagerAdapter { List<Entity> list_ee; public MyAdapter(FragmentManager fm, List<Entity> ee) { super(fm); this.list_ee = ee ; } @Override public int getCount() { return list_ee.size(); } // 初始化每个页卡选项 @Override public Object instantiateItem(ViewGroup arg0, int position) { ArrayFragment ff = (ArrayFragment)super.instantiateItem(arg0, position); ff.setThings(list_ee.get(position),position); return ff; } @Override public void destroyItem(ViewGroup container, int position, Object object) { System.out.println( "position Destory" + position); super.destroyItem(container, position, object); } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return new ArrayFragment(); } } /** * 所有的 每个Fragment */ public class ArrayFragment extends Fragment { private Entity ee; private int position; public void setThings(Entity ee,int position){ this.ee =ee ; this.position = position; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("onCreateView = "); //在这里加载每个 fragment的显示的 View View v = inflater.inflate(R.layout.pagers_fragment1, container, false); ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { System.out.println("onActivityCreated = "); super.onActivityCreated(savedInstanceState); } @Override public void onDestroyView(){ System.out.println("onDestroyView = "+ position); super.onDestroyView(); } @Override public void onDestroy(){ System.out.println("onDestroy = "+ position); super.onDestroy(); } } }
直接复制过去就可以看效果了 别忘记 V4包,xml 布局文件 自己随便整个吧。
滑动到第3个页面的时候可以看到第1个页面销毁第4个生成,当前存在2、3、4:
更多Android App中使用ViewPager+Fragment实现滑动切换效果相关文章请关注PHP中文网!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

在使用IntelliJIDEAUltimate版本启动Spring...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...

理解Spring项目启动中循环依赖的随机性在进行Spring项目开发时,可能会遇到项目启动时由于循环依赖导致的随机...
