zoukankan      html  css  js  c++  java
  • ViewPager + Fragment 替换 TabActivity

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zilla.blog.51cto.com/3095640/967387

    ViewPager + Fragment 替换 TabActivity

    Fragment+ViewPager 替换 TabActivity
    之前首页的框架采用TabActivity+Activity的形式实现,首页页面切换时,性能消耗较大,本次修改可以大大节约页面切换性能。
    下面是这次框架调整的一些具体内容
    思路
    使用ViewPager作为首页的容器,替换TabActivity;
    使用Fragment作为具体页面的容器,替换Activity;
    将Fragment添加到ViewPager中,以实现页面切换。
    实现
    ViewPager实现
    引入:
    ViewPager可以通过layout
    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的列表的引用。
    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. public MainFragmentPagerAdapter(FragmentManager fm,ArrayList<Fragment> fragments){ 
    7. super(fm); 
    8. this.fragments = fragments; 
    9. /* (non-Javadoc) 
    10.  * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
    11.  */ 
    12. @Override 
    13. public Fragment getItem(int arg0) { 
    14. return fragments.get(arg0); 
    15. /* (non-Javadoc) 
    16.  * @see android.support.v4.view.PagerAdapter#getCount() 
    17.  */ 
    18. @Override 
    19. public int getCount() { 
    20. return fragments.size(); 
    21. @Override 
    22. public int getItemPosition(Object object) { 
    23. // TODO Auto-generated method stub 
    24. return super.getItemPosition(object); 
    事件:
    这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
    这两个事件的任务是:
    1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
    2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。
    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. @Override 
    9. public void onPageScrolled(int arg0, float arg1, int arg2) { 
    10. @Override 
    11. public void onPageScrollStateChanged(int arg0) { 
    12. }; 
    touchListener定义如下:
    1. private OnTouchListener touchListener = new OnTouchListener(){ 
    2. @Override 
    3. public boolean onTouch(View v, MotionEvent event) { 
    4. if (currentIndex != 0) { 
    5. return false
    6. int[] location = new int[2]; 
    7. homeFragment.gallery.getLocationOnScreen(location); 
    8. if (location[0] != 0) { 
    9. return false
    10. if (event.getRawY() > location[1
    11. && event.getRawY() - location[1] < homeFragment.gallery 
    12. .getHeight()) { 
    13. return homeFragment.gallery.dispatchTouchEvent(event); 
    14. return false
    15. }; 
    Fragment实现
    Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
    1. protected void onCreate(Bundle savedInstanceState) { 
    2. super.onCreate(savedInstanceState); 
    3. setContentView(R.layout.setting); 
    4. getView(); 
    5. setListener(); 
    对应的Fragment中的onCrateView方法为:
    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; 
    注意点
    ViewPager与底部工具栏同步
    Viewpager改变通知底部工具栏索引改变:
    viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
    底部工具栏索引发生改变通知ViewPager切换页面
    viewPager.setCurrentItem(i);
    与Gallery冲突解决
    为ViewPager注册Touch事件
    1. private OnTouchListener touchListener = new OnTouchListener(){ 
    2. @Override 
    3. public boolean onTouch(View v, MotionEvent event) { 
    4. if (currentIndex != 0) { 
    5. return false
    6. int[] location = new int[2]; 
    7. homeFragment.gallery.getLocationOnScreen(location); 
    8. if (location[0] != 0) { 
    9. return false
    10. if (event.getRawY() > location[1
    11. && event.getRawY() - location[1] < homeFragment.gallery 
    12. .getHeight()) { 
    13. return homeFragment.gallery.dispatchTouchEvent(event); 
    14. return false
    15. }; 
    默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。

    本文出自 “雨轩印象” 博客,请务必保留此出处http://zilla.blog.51cto.com/3095640/967387

  • 相关阅读:
    测试智力
    《Asp.Net 2.0 揭秘》读书笔记(十四)
    《Asp.Net 2.0 揭秘》读书笔记(十七)
    《Asp.Net 2.0 揭秘》读书笔记(十三)
    《Asp.Net 2.0 揭秘》读书笔记(十二)
    《Asp.Net 2.0 揭秘》读书笔记(十)
    《Asp.Net 2.0 揭秘》读书笔记(十五)
    《Asp.Net 2.0 揭秘》读书笔记(十八)
    《Asp.Net 2.0 揭秘》读书笔记(十一)
    《Asp.Net 2.0 揭秘》读书笔记(十六)
  • 原文地址:https://www.cnblogs.com/greywolf/p/2824918.html
Copyright © 2011-2022 走看看