Android App中使用ViewPager+Fragment实现滑动切换效果

作者:安卓吧 时间:2023-01-12 19:51:50 

在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  - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。

工程结构:

Android App中使用ViewPager+Fragment实现滑动切换效果

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实现滑动切换效果

标签:Android,ViewPager
0
投稿

猜你喜欢

  • C语言 socketpair用法案例讲解

    2022-07-24 12:41:48
  • Android Service启动流程刨析

    2023-07-31 11:28:58
  • C#+MO实现一个道路编辑软件(刚开始)

    2023-03-28 08:52:05
  • Android recyclerview实现拖拽排序和侧滑删除

    2021-10-04 00:33:16
  • springBoot解决static和@Component遇到的bug

    2022-12-31 01:23:27
  • C语言字符串大小比较

    2022-06-02 14:15:17
  • Android Monkey压力测试详细介绍

    2021-10-24 08:02:37
  • c# 模拟串口通信 SerialPort的实现示例

    2023-09-03 22:19:50
  • Android按钮单击事件的四种常用写法总结

    2023-07-15 09:05:18
  • Android实现使用微信登录第三方APP的方法

    2021-06-09 00:05:02
  • Centos6.5搭建java开发环境配置详解

    2021-09-27 06:22:03
  • JavaWeb开发中alias拦截器的使用方法

    2023-08-20 10:36:55
  • C#获取U盘序列号的方法

    2023-09-15 02:09:54
  • IntelliJ IDEA Run时报“无效的源发行版:16“错误问题及解决方法

    2022-06-04 18:08:35
  • Android中Service实时向Activity传递数据实例分析

    2022-07-22 20:44:15
  • flutter实现底部导航栏

    2023-08-23 01:06:13
  • Json字符串转Java对象和List代码实例

    2022-03-11 15:47:09
  • 如何用Stream解决两层List属性求和问题

    2022-07-31 20:32:35
  • Android 嵌套Fragment的使用实例代码

    2022-07-18 06:37:15
  • 浅析C#中静态方法和非静态方法的区别

    2023-04-07 07:55:15
  • asp之家 软件编程 m.aspxhome.com