前言
之前的文章有介紹activitygroup,不少人問嵌套使用的問題,同樣的需求在fragment中也存在,幸好在最新的android support 包已經支援這一特性!這裡就跳過fragment的介紹,需要注意的是tabactivity已經被标記為棄用(deprecated)。
聲明
歡迎轉載,但請保留文章原始出處:)
部落格園:http://www.cnblogs.com
農民伯伯: http://www.cnblogs.com/over140/
正文
一、準備
二、截圖

三、代碼
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();
}
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));
case r.id.btnmodule3:
addfragmenttostack(fragmentparent.newinstance(2));
}
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;
}
};
}
public int getcount() {
return 3;
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_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" />
android:id="@+id/btnmodule2"
android:src="@android:drawable/ic_dialog_info" />
android:id="@+id/btnmodule3"
android:src="@android:drawable/ic_dialog_alert" />
</linearlayout>
</linearlayout>
viewpager_fragments.xml
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_gravity="top" />
</android.support.v4.view.viewpager>
注意!實踐發現viewpager并不能作為頂層容器,否則會報錯。
四、說明
這是一個典型的嵌套fragment的例子,最外層使用framelayout來實作幾大子產品的切換,内部使用viewpager實作子子產品的切換,非常實用。
結束
考慮把support package, revision 11 更新翻譯一下,強烈建議大家更新到最新的相容包。
轉載:http://www.cnblogs.com/over140/archive/2013/02/18/2842227.html