很多时候,一个应用有多个功能点,分属于不同的类别,存在这样的需求,不同的布局展示不同的功能,那么Fragment和ViewPager就是一个很好的帮手了。
而Fragment是3.0以后才提供的一个功能,所以在3.x之前的,如果要用Fragment的话,就要用support v4包了。
在Eclipse中升级到最新版的ADT之后,会发现通过Wizard来创建的Android项目,都默认会用Fragment来作为处理事务的主要逻辑窗口,而Activity则不再干这事了,这可能是Android想要强推Fragment的使用了吧,尽量将不同业务逻辑的控制分散到不同的Fragment中,降低程序的耦合度。
今天的小Demo就是来展示如何应用Fragment和ViewPager来显示不同的分组展现,具体效果先看下图:
如图上所示:
1)在界面上有两个页面,一个是显示正在运行的应用程序,一个是显示正在运行的服务,它们是由两个Fragment来展示的。
2)在屏幕下面有两个按钮,通过这两个按钮,可以分别切换到不同的Fragment中去。
3)ViewPager在这里作为Fragment的容器,通过左右滑动,可以在不同的Fragment中切换。
接下来我们看看一些关键的实现:
主界面的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.lms.kicker.KickerMainActivity"
tools:ignore="MergeRootFrame" >
<android.support.v4.view.ViewPager
android:id="@+id/vpContainer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingBottom="@dimen/activity_horizontal_margin"
android:paddingLeft="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"
android:paddingTop="@dimen/activity_horizontal_margin" />
<RadioGroup
android:id="@+id/rgTabButtons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rbRunningApp"
style="@style/MainTags"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/tag_running_app" />
<RadioButton
android:id="@+id/rbRunningService"
style="@style/MainTags"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/tag_running_service" />
</RadioGroup>
</LinearLayout>
1)上方是一个ViewPager
2)下面是一个RadioGroup,包含两个RadioButton,有N个Fragment,就使用N个RadioButton。因为在RadioGroup里面的RadioButton是互斥的,刚好跟我们只需要在某一个时刻只能有一个Fragment被选中并展示的需求符合。
至于两个Fragment里面的具体内容,大家看源码就好了。
FragmentPagerAdapter
每一个ViewPager都需要一个数据源的PagerAdapter,如果是展示图片,那就是一个关于图片的PagerAdapter,如果是展示Fragment,当然就是要有一个关于Fragment的PagerAdapter了。而Android本身就已经为我们提供了两个关于Fragment的PagerAdapter,在我们这里就只需要用FragmentPagerAdapter就好了,其代码如下:
class KickerFragmentAdapter extends FragmentPagerAdapter {
private Context mContext;
public KickerFragmentAdapter(FragmentManager fm, Context context) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int arg0) {
return Fragment.instantiate(mContext, fragmetns[arg0]);
}
@Override
public int getCount() {
return fragmetns.length;
}
}
FragmentPagerAdapter的代码逻辑很简单,跟一般的BaseAdapter类似,它主要有三个方法必须实现:
1)带FragmentManager的构造函数,用Support包的话,必须如下调用 :
KickerFragmentAdapter adpater = new KickerFragmentAdapter(getSupportFragmentManager(), this);
2)getItem方法
在个方法里面,利用Fragment.instantiate方法对应的Fragment,其中第二个参数 fname,就是对应Fragment的类名,如下:
private String[] fragmetns = new String[] {
RunningAppFragment.class.getName(),
RunningServiceFragment.class.getName() };
3)getCount,返回Pager的个数。
OnPageChangeListener 和 OnCheckedChangeListener
为了跟下面的RadioGroup进行呼应,我们还需要对ViewPager和RadioGroup添加对应的响应函数,如下:
private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
mCurrentFragment = arg0;((RadioButton) rgTabButtons.getChildAt(arg0)).setChecked(true);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
};
private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int checkedItem = 0;
switch (checkedId) {
case R.id.rbRunningApp:
checkedItem = 0;
break;
case R.id.rbRunningService:
checkedItem = 1;
break;
}
vpContainer.setCurrentItem(checkedItem);
mCurrentFragment = checkedItem;
}
};
这里的主要功能是为了:
1)在ViewPager中滑动到不同的Fragment的时候,下面的RadioGroup要发生改变。
2)当点击下面的RadioGroup的时候,ViewPager中也要定位到对应的fragment中去。
自定义Listener
为了跟Activity进行交流,我们必须为不同的Fragment定义接口,然后由Activity中实现这个接口,通过回调函数的作用,可以让Fragment中发生改变的时候同时作用到Activity中,如下,在RunningAppFragment.java中:
public interface OnRunningAppRefreshListener {
public void onRunningAppRefreshed();
}
而与此同时,Activity必须实现这个接口,如下:
public class KickerMainActivity extends ActionBarActivity implements RunningAppFragment.OnRunningAppRefreshListener{
为了保证Activity有实现这个接口,我们可以在onAttach的时候,将Activity强制转化为这个接口对象,如下:
public void onAttach(Activity activity){
super.onAttach(activity);
try{
onRunningAppRefreshListener = (OnRunningAppRefreshListener) activity;
}catch(ClassCastException e){
throw new ClassCastException(activity.toString()
+ " must implement OnRunningAppRefreshListener");
}
}
这样,如果Activity没有实现这个接口,就会抛出异常。
分享到:
相关推荐
请参考: Android学习小Demo(17)关于ViewPager和Fragment的使用 http://blog.csdn.net/linmiansheng/article/details/23282797
试用于各类型的APP框架滑动与点击切换并行
自己做的一个ViewPager和Fragment的小Demo程序,程序没什么注释,可能有点乱,凑合看吧
ViewPager+Fragment组成写成Tab导航栏
FragmentActivity +Fragment实现底部Tab切换,Fragment内viewPager再嵌套Fragment实现页面流畅滑动切换!
viewpager里放了几个fragment,本来只有这么一个页面,显示出来也没什么问题,现在加新需求,要求点击viewpager里的一个fragment里的按钮跳转到另一个fragment,新fragment按返回按钮返回盛放viewpager的fragment,...
RecycleView + Fragment 替换 ViewPager + Fragment 的Demo,效果还不错
该Demo为Fragment中嵌套(Fragment+ViewPager),在实际的项目中要注意Activity和Fragment的生命周期,以及它们随时可能被销毁的情况。
写了一个viewpager的demo,希望能相互学习
学习开源中国Android客户端,一边写学习博客一边看源码制作的demo之三。
Android ViewPager+Fragment嵌套使用Demo
这个demo所实现的功能就是标题栏本来是在banner的下方,当滑动下面的RecyclerView的时候标题栏会随着向上移动,但是当标题栏移动到顶部时是要悬浮在顶部,下面无论如何上滑标题拦都不再移动,当向下滑动时知直到出现...
Android基于Fragment+ViewPager制作的简单开机动画以及引导页Demo源码,我的资源中还有一个FragmentDemo是不能够左右滑动翻页的,都是免费下载,有兴趣的可以下载学习
ViewPager配合Fragment实现横滑的最简单的demo,供初学者学习和理解横滑的实现。
android app 快速开发框架(挑选最简洁最适用的框架实现) 1)外层 FragmentTabHost+Fragment构建外层框架 2)内层 TabPageIndicator+ViewPager+Fragment构建内层滑动框架
详细学习Fragment请看http://write.blog.csdn.net/postedit/40984627
笔者之前已经写过了关于viewpager的demo,但是之前是通过将Activity转化为view,然后放入viewpager实现的,具体操作中有时候还是不如fragment方便。 之前的viewpager demo的地址:...
本Demo是TabLayout+ViewPager+Fragment滑动复用结构,Fragment使用了一个三级RecycleView,数据来源于Gson本地解析
Androidfragment结合viewpager的滑动与点击,简单的小demo,包含xml数据解析,sqllite,动态权限等
前几年的Android应用源码Demo,主要面向的是学生毕业设计学习。