您的位置:首页 > 其它

Fragment+ViewPage 替换TabActivity

2013-09-10 09:58 316 查看
Fragment+ViewPager替换TabActivity(2013-04-1618:22:57)

分类:
Fragment
之前首页的框架采用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中去,算是一个补丁吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: