Android ViewPager + Fragment 替换 TabActivity

Fragment+ViewPager 替换 TabActivity
之前首页的框架采用TabActivity+Activity的形式实现,首页页面切换时,性能消耗较大,本次修改可以大大节约页面切换性能。
下面是这次框架调整的一些具体内容
思路
使用ViewPager作为首页的容器,替换TabActivity;
使用Fragment作为具体页面的容器,替换Activity;
将Fragment添加到ViewPager中,以实现页面切换。
实现
ViewPager实现
引入:
ViewPager可以通过layout

 

[java]  view plain copy
  1. <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"   
  2.     android:layout_width="match_parent"   
  3.     android:layout_height="fill_parent"   
  4.     android:background="#ffffff"   
  5.     android:flipInterval="30"   
  6.     android:persistentDrawingCache="animation"   
  7.     android:layout_centerInParent="true"   
  8.      >   
  9. </android.support.v4.view.ViewPager>   

适配器:
因为ViewPager中存放的是一系列的Fragment,所以需要一个Fragment的适配器,该适配器中保存了对首页各个Fragment的列表的引用。

[java]  view plain copy
  1. public class MainFragmentPagerAdapter extends FragmentPagerAdapter {   
  2. private ArrayList<Fragment> fragments;   
  3. public MainFragmentPagerAdapter(FragmentManager fm) {   
  4. super(fm);   
  5. // TODO Auto-generated constructor stub   
  6. }   
  7. public MainFragmentPagerAdapter(FragmentManager fm,ArrayList<Fragment> fragments){   
  8. super(fm);   
  9. this.fragments = fragments;   
  10. }   
  11. /* (non-Javadoc)  
  12.  * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)  
  13.  */   
  14. @Override   
  15. public Fragment getItem(int arg0) {   
  16. return fragments.get(arg0);   
  17. }   
  18. /* (non-Javadoc)  
  19.  * @see android.support.v4.view.PagerAdapter#getCount()  
  20.  */   
  21. @Override   
  22. public int getCount() {   
  23. return fragments.size();   
  24. }   
  25. @Override   
  26. public int getItemPosition(Object object) {   
  27. // TODO Auto-generated method stub   
  28. return super.getItemPosition(object);   
  29. }   
  30. }   
事件:
这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
这两个事件的任务是:
1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。

[java]  view plain copy
  1. viewPager.setOnPageChangeListener(pageChangeListener);   
  2. viewPager.setOnTouchListener(touchListener);   
  3. pageChangeListener定义如下:   
  4. private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {   
  5. @Override   
  6. public void onPageSelected(int arg0) {   
  7. setIconSelected(arg0);   
  8. }   
  9. @Override   
  10. public void onPageScrolled(int arg0, float arg1, int arg2) {   
  11. }   
  12. @Override   
  13. public void onPageScrollStateChanged(int arg0) {   
  14. }   
  15. };   
  16. touchListener定义如下:  
  17.    
  18. private OnTouchListener touchListener = new OnTouchListener(){   
  19. @Override   
  20. public boolean onTouch(View v, MotionEvent event) {   
  21. if (currentIndex != 0) {   
  22. return false;   
  23. }   
  24. int[] location = new int[2];   
  25. homeFragment.gallery.getLocationOnScreen(location);   
  26. if (location[0] != 0) {   
  27. return false;   
  28. }   
  29. if (event.getRawY() > location[1]   
  30. && event.getRawY() - location[1] < homeFragment.gallery   
  31. .getHeight()) {   
  32. return homeFragment.gallery.dispatchTouchEvent(event);   
  33. }   
  34. return false;   
  35. }   
  36. };   
ragment实现
Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
[java]  view plain copy
  1. protected void onCreate(Bundle savedInstanceState) {   
  2. super.onCreate(savedInstanceState);   
  3. setContentView(R.layout.setting);   
  4. getView();   
  5. setListener();   
  6. }   


对应的Fragment中的onCrateView方法为:

[java]  view plain copy
  1. public View onCreateView(LayoutInflater inflater, ViewGroup container,   
  2. Bundle savedInstanceState) {   
  3. Utils.log("onCreateView");   
  4. View v = inflater.inflate(R.layout.setting, container, false);   
  5. getViews(v);   
  6. setListener();   
  7. return v;   
  8. }   


注意点
ViewPager与底部工具栏同步
Viewpager改变通知底部工具栏索引改变:
viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
底部工具栏索引发生改变通知ViewPager切换页面
viewPager.setCurrentItem(i);
与Gallery冲突解决
为ViewPager注册Touch事件
[java]  view plain copy
  1. private OnTouchListener touchListener = new OnTouchListener(){   
  2. @Override   
  3. public boolean onTouch(View v, MotionEvent event) {   
  4. if (currentIndex != 0) {   
  5. return false;   
  6. }   
  7. int[] location = new int[2];   
  8. homeFragment.gallery.getLocationOnScreen(location);   
  9. if (location[0] != 0) {   
  10. return false;   
  11. }   
  12. if (event.getRawY() > location[1]   
  13. && event.getRawY() - location[1] < homeFragment.gallery   
  14. .getHeight()) {   
  15. return homeFragment.gallery.dispatchTouchEvent(event);   
  16. }   
  17. return false;   
  18. }   
  19. };   


默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。
 
本文出自 “雨轩印象” 博客,出处:http://zilla.blog.51cto.com/3095640/967387

上面的地址空间颜色很黑,刺眼,可以访问这个网址,查找更多:http://blog.csdn.net/jdsjlzx/article/details/7910942



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值