您的位置:首页 > 其它

Fragment+ViewPager 替换TabActivity

2014-05-16 10:52 375 查看
本文出自 “雨轩印象” 博客,请务必保留此出处http://zilla.blog.51cto.com/3095640/967387

之前首页的框架采用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中去,算是一个补丁吧。

 

本文出自 “雨轩印象” 博客,请务必保留此出处http://zilla.blog.51cto.com/3095640/967387
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: