Android 嵌套Fragment的使用实例代码
程序员文章站
2024-03-06 10:19:19
前言
之前的文章有介绍activitygroup,不少人问嵌套使用的问题,同样的需求在fragment中也存在,幸好在最新的android support...
前言
之前的文章有介绍activitygroup,不少人问嵌套使用的问题,同样的需求在fragment中也存在,幸好在最新的android support 包已经支持这一特性!这里就跳过fragment的介绍,需要注意的是tabactivity已经被标记为弃用(deprecated)。
正文
一、准备
关于最新的android兼容包的介绍,参见官网。可以在android sdk目录下extras/android/support/v13/android-support-v13.jar找到最新版,注意是伴随着android 4.2一起更新的。
关于嵌套fragment的介绍,参照官网。
二、截图
三、代码
fragmentnestactivity.java
import android.graphics.color; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentstatepageradapter; import android.support.v4.app.fragmenttransaction; import android.support.v4.view.viewpager; import android.view.gravity; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.textview; /** * 嵌套fragment使用 * * @author 农民伯伯 * @see http://www.cnblogs.com/over140/archive/2013/01/02/2842227.html * */ public class fragmentnestactivity extends fragmentactivity implements onclicklistener { @override protected void oncreate(bundle arg0) { super.oncreate(arg0); setcontentview(r.layout.nested_fragments); findviewbyid(r.id.btnmodule1).setonclicklistener(this); findviewbyid(r.id.btnmodule2).setonclicklistener(this); findviewbyid(r.id.btnmodule3).setonclicklistener(this); findviewbyid(r.id.btnmodule1).performclick(); } @override public void onclick(view v) { switch (v.getid()) { case r.id.btnmodule1: addfragmenttostack(fragmentparent.newinstance(0)); break; case r.id.btnmodule2: addfragmenttostack(fragmentparent.newinstance(1)); break; case r.id.btnmodule3: addfragmenttostack(fragmentparent.newinstance(2)); break; } } private void addfragmenttostack(fragment fragment) { fragmenttransaction ft = getsupportfragmentmanager().begintransaction(); // ft.setcustomanimations(android.r.anim.slide_in_left, android.r.anim.slide_in_left); ft.replace(r.id.fragment_container, fragment); ft.commit(); } /** 嵌套fragment */ public final static class fragmentparent extends fragment { public static final fragmentparent newinstance(int position) { fragmentparent f = new fragmentparent(); bundle args = new bundle(2); args.putint("position", position); f.setarguments(args); return f; } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view convertview = inflater.inflate(r.layout.viewpager_fragments, container, false); viewpager pager = (viewpager) convertview.findviewbyid(r.id.pager); final int parent_position = getarguments().getint("position"); //注意这里的代码 pager.setadapter(new fragmentstatepageradapter(getchildfragmentmanager()) { @override public fragment getitem(final int position) { return new fragment() { @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { textview convertview = new textview(getactivity()); convertview.setlayoutparams(new viewgroup.layoutparams(viewgroup.layoutparams.fill_parent, viewgroup.layoutparams.fill_parent)); convertview.setgravity(gravity.center); convertview.settextsize(30); convertview.settextcolor(color.black); convertview.settext("page " + position); return convertview; } }; } @override public int getcount() { return 3; } @override public charsequence getpagetitle(int position) { return "page " + parent_position + " - " + position; } }); return convertview; } } }
代码说明:
这里最关键的是方法getchildfragmentmanager的支持。这里也演示了fragment作为嵌套内部类的使用方法。
nested_fragments.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <framelayout android:id="@+id/fragment_container" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1.0" android:background="#f7f5de" > </framelayout> <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:background="@android:color/black" android:orientation="horizontal" > <imageview android:id="@+id/btnmodule1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginbottom="3dp" android:layout_marginleft="7dp" android:layout_margintop="3dp" android:src="@android:drawable/ic_dialog_dialer" /> <imageview android:id="@+id/btnmodule2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginbottom="3dp" android:layout_marginleft="7dp" android:layout_margintop="3dp" android:src="@android:drawable/ic_dialog_info" /> <imageview android:id="@+id/btnmodule3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginbottom="3dp" android:layout_marginleft="7dp" android:layout_margintop="3dp" android:src="@android:drawable/ic_dialog_alert" /> </linearlayout> </linearlayout>
viewpager_fragments.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.viewpager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.pagertitlestrip android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" /> </android.support.v4.view.viewpager> </linearlayout>
代码说明:
注意!实践发现viewpager并不能作为顶层容器,否则会报错。
四、说明
这是一个典型的嵌套fragment的例子,最外层使用framelayout来实现几大模块的切换,内部使用viewpager实现子模块的切换,非常实用。
结束
考虑把support package, revision 11 更新翻译一下,强烈建议大家升级到最新的兼容包。
下一篇: 习题3-3 出租车计价
推荐阅读
-
详解Android开发中Fragment的使用
-
Android 解决嵌套Fragment无法接收onCreateOptionsMenu事件的问题
-
Android 嵌套Fragment的使用实例代码
-
Android 保存Fragment 切换状态实例代码
-
Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法
-
Android使用PullToRefresh实现上拉加载和下拉刷新效果的代码
-
Android 图片的颜色处理实例代码
-
Android 动态添加Fragment的实例代码
-
Android shape和selector 结合使用实例代码
-
Android的OkHttp包处理用户认证的代码实例分享