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

  • 相关阅读:
    169. Majority Element
    283. Move Zeroes
    1331. Rank Transform of an Array
    566. Reshape the Matrix
    985. Sum of Even Numbers After Queries
    1185. Day of the Week
    867. Transpose Matrix
    1217. Play with Chips
    766. Toeplitz Matrix
    1413. Minimum Value to Get Positive Step by Step Sum
  • 原文地址:https://www.cnblogs.com/greywolf/p/2824918.html
Copyright © 2011-2022 走看看