Android学习小Demo(17)关于ViewPager和Fragment的使用
来源:互联网 发布:花样字体软件下载 编辑:程序博客网 时间:2024/04/28 15:07
很多时候,一个应用有多个功能点,分属于不同的类别,存在这样的需求,不同的布局展示不同的功能,那么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
至于两个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;}@Overridepublic Fragment getItem(int arg0) {return Fragment.instantiate(mContext, fragmetns[arg0]);}@Overridepublic 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() {@Overridepublic void onPageSelected(int arg0) {mCurrentFragment = arg0;((RadioButton) rgTabButtons.getChildAt(arg0)).setChecked(true);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}};private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {@Overridepublic 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没有实现这个接口,就会抛出异常。
结束。源代码点击下载!
3 0
- Android学习小Demo(17)关于ViewPager和Fragment的使用
- Android学习小Demo(20)关于Fragment的应用
- android关于TabLayout+ViewPager结合使用的小Demo
- 关于ViewPager和Fragment的使用
- viewpager+fragment实现的一个小Demo
- Android学习小Demo(13)Android中关于ContentObserver的使用
- Android学习小Demo(14)Android中关于PopupWindow的使用
- Android学习小Demo(14)Android中关于PopupWindow的使用
- Android学习小Demo(14)Android中关于PopupWindow的使用
- Android ViewPager + Fragment的使用
- Android ViewPager+Fragment的使用
- Android 关于ViewPager结合碎片Fragment的简单使用
- 关于ViewPager和Fragment配合使用生命周期的问题。
- 关于ViewPager和Fragment的使用初级。适合初学者
- ViewPager和fragment的使用
- ViewPager 和Fragment的使用
- ViewPager和Fragment的使用
- fragment和viewpager的使用
- iOS网络编程同步GET方法请求编程
- Java 文件简单复制操作
- 加载fragment的error问题
- 更换Eclipse或者MyEclipse中SVN插件已经保存的账号密码
- 只为黄陈晨变得勇敢
- Android学习小Demo(17)关于ViewPager和Fragment的使用
- linux网络基础之路由器远程配置和更新
- 你说你好孤独日子过得很辛苦
- 从元素抽取属性,文本和HTML----JSOUP
- Go语言使用组合的方式实现多继承
- 弹出一个窗口 java
- POJ 2969 Divisibility by 15
- sql 语法
- iOS网络编程异步GET方法请求编程