Fragment+ViewPage 替换TabActivity
2013-09-10 09:58
316 查看
Fragment+ViewPager替换TabActivity(2013-04-1618:22:57)
之前首页的框架采用TabActivity+Activity的形式实现,首页页面切换时,性能消耗较大,本次修改可以大大节约页面切换性能。
下面是这次框架调整的一些具体内容
思路
使用ViewPager作为首页的容器,替换TabActivity;
使用Fragment作为具体页面的容器,替换Activity;
将Fragment添加到ViewPager中,以实现页面切换。
实现
ViewPager实现
引入:
ViewPager可以通过layout
<</span>android.support.v4.view.ViewPagerxmlns: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"
>
</</span>android.support.v4.view.ViewPager>
适配器:
因为ViewPager中存放的是一系列的Fragment,所以需要一个Fragment的适配器,该适配器中保存了对首页各个Fragment的列表的引用。
publicclassMainFragmentPagerAdapterextendsFragmentPagerAdapter{
privateArrayListfragments;
publicMainFragmentPagerAdapter(FragmentManagerfm){
super(fm);
//TODOAuto-generatedconstructorstub
}
publicMainFragmentPagerAdapter(FragmentManagerfm,ArrayListfragments){
super(fm);
this.fragments=fragments;
}
@Override
publicFragmentgetItem(intarg0){
returnfragments.get(arg0);
}
@Override
publicintgetCount(){
returnfragments.size();
}
@Override
publicintgetItemPosition(Objectobject){
//TODOAuto-generatedmethodstub
returnsuper.getItemPosition(object);
}
}
事件:
这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
这两个事件的任务是:
1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。
viewPager.setOnPageChangeListener(pageChangeListener);
viewPager.setOnTouchListener(touchListener);
pageChangeListener定义如下:
privateOnPageChangeListenerpageChangeListener=newOnPageChangeListener(){
@Override
publicvoidonPageSelected(intarg0){
setIconSelected(arg0);
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
};
touchListener定义如下:
privateOnTouchListenertouchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(currentIndex!=0){
returnfalse;
}
int[]location=newint[2];
homeFragment.gallery.getLocationOnScreen(location);
if(location[0]!=0){
returnfalse;
}
if(event.getRawY()>location[1]
&&event.getRawY()-location[1]<homeFragment.gallery
.getHeight()){
returnhomeFragment.gallery.dispatchTouchEvent(event);
}
returnfalse;
}
};
Fragment实现
Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.setting);
getView();
setListener();
}
对应的Fragment中的onCrateView方法为:
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Utils.log("onCreateView");
Viewv=inflater.inflate(R.layout.setting,container,false);
getViews(v);
setListener();
returnv;
}
注意点
ViewPager与底部工具栏同步
Viewpager改变通知底部工具栏索引改变:
viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
底部工具栏索引发生改变通知ViewPager切换页面
viewPager.setCurrentItem(i);
与Gallery冲突解决
为ViewPager注册Touch事件
privateOnTouchListenertouchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(currentIndex!=0){
returnfalse;
}
int[]location=newint[2];
homeFragment.gallery.getLocationOnScreen(location);
if(location[0]!=0){
returnfalse;
}
if(event.getRawY()>location[1]
&&event.getRawY()-location[1]<homeFragment.gallery
.getHeight()){
returnhomeFragment.gallery.dispatchTouchEvent(event);
}
returnfalse;
}
};
默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。
分类: Fragment |
下面是这次框架调整的一些具体内容
思路
使用ViewPager作为首页的容器,替换TabActivity;
使用Fragment作为具体页面的容器,替换Activity;
将Fragment添加到ViewPager中,以实现页面切换。
实现
ViewPager实现
引入:
ViewPager可以通过layout
<</span>android.support.v4.view.ViewPagerxmlns: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"
>
</</span>android.support.v4.view.ViewPager>
适配器:
因为ViewPager中存放的是一系列的Fragment,所以需要一个Fragment的适配器,该适配器中保存了对首页各个Fragment的列表的引用。
publicclassMainFragmentPagerAdapterextendsFragmentPagerAdapter{
privateArrayListfragments;
publicMainFragmentPagerAdapter(FragmentManagerfm){
super(fm);
//TODOAuto-generatedconstructorstub
}
publicMainFragmentPagerAdapter(FragmentManagerfm,ArrayListfragments){
super(fm);
this.fragments=fragments;
}
@Override
publicFragmentgetItem(intarg0){
returnfragments.get(arg0);
}
@Override
publicintgetCount(){
returnfragments.size();
}
@Override
publicintgetItemPosition(Objectobject){
//TODOAuto-generatedmethodstub
returnsuper.getItemPosition(object);
}
}
事件:
这里主要处理两个事件,1.OnPageChange事件;2.OnTouch事件
这两个事件的任务是:
1.OnPageChange事件,当页面发生切换时,通知底部工具栏改变焦点,以实现底部工具栏和页面之间同步。
2.OnTouch事件,该事件用于分发touch事件,解决与“主页”中的Gallery横屏时事件冲突的问题。
viewPager.setOnPageChangeListener(pageChangeListener);
viewPager.setOnTouchListener(touchListener);
pageChangeListener定义如下:
privateOnPageChangeListenerpageChangeListener=newOnPageChangeListener(){
@Override
publicvoidonPageSelected(intarg0){
setIconSelected(arg0);
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
};
touchListener定义如下:
privateOnTouchListenertouchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(currentIndex!=0){
returnfalse;
}
int[]location=newint[2];
homeFragment.gallery.getLocationOnScreen(location);
if(location[0]!=0){
returnfalse;
}
if(event.getRawY()>location[1]
&&event.getRawY()-location[1]<homeFragment.gallery
.getHeight()){
returnhomeFragment.gallery.dispatchTouchEvent(event);
}
returnfalse;
}
};
Fragment实现
Fragment的实现方式和Activity的实现方式基本相同,所需要注意的是要重写onCreateView方法。主要的内容是将Activity的onCreate方法中的内容写到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.setting);
getView();
setListener();
}
对应的Fragment中的onCrateView方法为:
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Utils.log("onCreateView");
Viewv=inflater.inflate(R.layout.setting,container,false);
getViews(v);
setListener();
returnv;
}
注意点
ViewPager与底部工具栏同步
Viewpager改变通知底部工具栏索引改变:
viewPager.setOnPageChangeListener(pageChangeListener);然后再onPageSelected方法中处理
底部工具栏索引发生改变通知ViewPager切换页面
viewPager.setCurrentItem(i);
与Gallery冲突解决
为ViewPager注册Touch事件
privateOnTouchListenertouchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(currentIndex!=0){
returnfalse;
}
int[]location=newint[2];
homeFragment.gallery.getLocationOnScreen(location);
if(location[0]!=0){
returnfalse;
}
if(event.getRawY()>location[1]
&&event.getRawY()-location[1]<homeFragment.gallery
.getHeight()){
returnhomeFragment.gallery.dispatchTouchEvent(event);
}
returnfalse;
}
};
默认情况下ViewPager内的Gallery拖动时没有效果,可以参考android的事件传递模型,这里是在touch的时候指定某一区域的事件传递到Gallery中去,算是一个补丁吧。
相关文章推荐
- ViewPager + Fragment 替换 TabActivity
- Android Tab大总结 Fragment+TabPageIndicator+ViewPager
- TabPageIndicator + ViewPager + FragmentPagerAdapter + Fragment分析APP主框架实现
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Fragment+ViewPager+TabPageIndicator使用的时候遇到的问题
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- 带有侧滑菜单的+ 通过retrofit获取数据,通过fresco框架加载图片,使用TabLayout + ViewPage + Fragment + ListView 显示数据
- TabPageIndicator+UnderlinePageIndicator+ViewPager+Fragment+懒加载
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- viewpage+fragment+tablayout+imageloder(代码)+适配+权限+依赖
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
- ViewPager+Fragment+TabPageIndicator
- Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager