ViewPager + Fragment 替换 TabActivity
2012-08-20 12:06
501 查看
ViewPager + Fragment 替换 TabActivity
Fragment+ViewPager 替换 TabActivity
之前首页的框架采用TabActivity+Activity的形式实现,首页页面切换时,性能消耗较大,本次修改可以大大节约页面切换性能。
下面是这次框架调整的一些具体内容
思路
使用ViewPager作为首页的容器,替换TabActivity;
使用Fragment作为具体页面的容器,替换Activity;
将Fragment添加到ViewPager中,以实现页面切换。
实现
ViewPager实现
引入:
ViewPager可以通过layout
适配器:
因为ViewPager中存放的是一系列的Fragment,所以需要一个Fragment的适配器,该适配器中保存了对首页各个Fragment的列表的引用。
事件:
这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
这两个事件的任务是:
1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。
touchListener定义如下:
Fragment实现
Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
对应的Fragment中的onCrateView方法为:
注意点
ViewPager与底部工具栏同步
Viewpager改变通知底部工具栏索引改变:
viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
底部工具栏索引发生改变通知ViewPager切换页面
viewPager.setCurrentItem(i);
与Gallery冲突解决
为ViewPager注册Touch事件
默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。
Fragment+ViewPager 替换 TabActivity
之前首页的框架采用TabActivity+Activity的形式实现,首页页面切换时,性能消耗较大,本次修改可以大大节约页面切换性能。
下面是这次框架调整的一些具体内容
思路
使用ViewPager作为首页的容器,替换TabActivity;
使用Fragment作为具体页面的容器,替换Activity;
将Fragment添加到ViewPager中,以实现页面切换。
实现
ViewPager实现
引入:
ViewPager可以通过layout
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="fill_parent" android:background="#ffffff" android:flipInterval="30" android:persistentDrawingCache="animation" android:layout_centerInParent="true" > </android.support.v4.view.ViewPager>
适配器:
因为ViewPager中存放的是一系列的Fragment,所以需要一个Fragment的适配器,该适配器中保存了对首页各个Fragment的列表的引用。
public class MainFragmentPagerAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> fragments; public MainFragmentPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } public MainFragmentPagerAdapter(FragmentManager fm,ArrayList<Fragment> fragments){ super(fm); this.fragments = fragments; } /* (non-Javadoc) * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) */ @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } /* (non-Javadoc) * @see android.support.v4.view.PagerAdapter#getCount() */ @Override public int getCount() { return fragments.size(); } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return super.getItemPosition(object); } }
事件:
这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
这两个事件的任务是:
1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。
viewPager.setOnPageChangeListener(pageChangeListener); viewPager.setOnTouchListener(touchListener); pageChangeListener定义如下: private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { setIconSelected(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } };
touchListener定义如下:
private OnTouchListener touchListener = new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if (currentIndex != 0) { return false; } int[] location = new int[2]; homeFragment.gallery.getLocationOnScreen(location); if (location[0] != 0) { return false; } if (event.getRawY() > location[1] && event.getRawY() - location[1] < homeFragment.gallery .getHeight()) { return homeFragment.gallery.dispatchTouchEvent(event); } return false; } };
Fragment实现
Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.setting); getView(); setListener(); }
对应的Fragment中的onCrateView方法为:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Utils.log("onCreateView"); View v = inflater.inflate(R.layout.setting, container, false); getViews(v); setListener(); return v; }
注意点
ViewPager与底部工具栏同步
Viewpager改变通知底部工具栏索引改变:
viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
底部工具栏索引发生改变通知ViewPager切换页面
viewPager.setCurrentItem(i);
与Gallery冲突解决
为ViewPager注册Touch事件
private OnTouchListener touchListener = new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if (currentIndex != 0) { return false; } int[] location = new int[2]; homeFragment.gallery.getLocationOnScreen(location); if (location[0] != 0) { return false; } if (event.getRawY() > location[1] && event.getRawY() - location[1] < homeFragment.gallery .getHeight()) { return homeFragment.gallery.dispatchTouchEvent(event); } return false; } };
默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。
相关文章推荐
- [有源码]ViewPager+Fragment+RadioButton替代TabActivity
- ViewPager+Fragment支持导航滑动以及点击切换,触发替换某个tab对应的fragment
- Fragment+ViewPage 替换TabActivity
- Activity,ViewPager,Fragment和TabLayout数据传递
- ActionBar和Fragment结合ViewPager实现TabActivity
- 【有源码】ViewPager+Fragment+RadioButton替代TabActivity
- 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab
- Fragment+ViewPager 替换TabActivity
- TabLayout +ViewPager+Fragment + RecycleView + webVie 4000 w加载本地html
- 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
- SlidingMenu,Tablayout,ViewPager,Fragment结合
- android java.lang.NoClassDefFoundError: cn.yw.lib.viewpagerfragment.ViewPagerFragmentActivity
- 框架搭建之首页风格一 Material Design风 第一话(Fragment +ViewPager+TabLayout)
- 某宅的Android学习笔记(三)——用ViewPager与FragmentPagerAdapter实现可以滑动的Tab
- PagerSlidingTabStrip关联viewpager时,viewpager上fragment切换时保持数据状态,以及viewpager默认缓存的去除
- 使用ViewPager+Fragment来实现带滚动条的多屏滑动-IndicatorFragmentActivity
- TabLayout的简单使用(TabLayout+Fragment+ViewPager)
- 笔记(二)TabLayout + ViewPager + FragmentPagerAdapter 组合用法
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android ViewPager和Fragment实现顶部导航界面滑动效果、标签下的tab位置