天天看點

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

一、準備

二、截圖

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

三、代碼 

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實作子子產品的切換,非常實用。