天天看點

【Andorid X 項目筆記】嵌套Fragment的使用(5)

前言

 之前的文章有介紹activitygroup,不少人問嵌套使用的問題,同樣的需求在fragment中也存在,幸好在最新的android support 包已經支援這一特性!這裡就跳過fragment的介紹,需要注意的是tabactivity已經被标記為棄用(deprecated)。

聲明

歡迎轉載,但請保留文章原始出處:)

部落格園:http://www.cnblogs.com

農民伯伯: http://www.cnblogs.com/over140/ 

正文

一、準備

二、截圖

【Andorid X 項目筆記】嵌套Fragment的使用(5)

三、代碼 

fragmentnestactivity.java

【Andorid X 項目筆記】嵌套Fragment的使用(5)

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;

}

【Andorid X 項目筆記】嵌套Fragment的使用(5)

代碼說明:

這裡最關鍵的是方法getchildfragmentmanager的支援。這裡也示範了fragment作為嵌套内部類的使用方法。

nested_fragments.xml 

【Andorid X 項目筆記】嵌套Fragment的使用(5)

<?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>

【Andorid X 項目筆記】嵌套Fragment的使用(5)

viewpager_fragments.xml 

【Andorid X 項目筆記】嵌套Fragment的使用(5)

    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>

【Andorid X 項目筆記】嵌套Fragment的使用(5)

注意!實踐發現viewpager并不能作為頂層容器,否則會報錯。

四、說明

這是一個典型的嵌套fragment的例子,最外層使用framelayout來實作幾大子產品的切換,内部使用viewpager實作子子產品的切換,非常實用。 

結束

考慮把support package, revision 11 更新翻譯一下,強烈建議大家更新到最新的相容包。

轉載:http://www.cnblogs.com/over140/archive/2013/02/18/2842227.html