1. 程式人生 > >Fragemnt(靜態新增Fragment,簡單的動態新增Fragment)

Fragemnt(靜態新增Fragment,簡單的動態新增Fragment)

在這裡我們全部使用android-support-v4.jar包裡Fragment,不用系統自帶的Fragment;這兩個基本一樣,但V4包中的相對功能更強大一些。
第一步:新建一個專案工程新增一個fragment1.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:background="#00ff00" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="this is 1" android:textColor="#000000" android:textSize="25sp"/> </LinearLayout>

第二步:新建一個fragment2.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:background="#00ff00"
    android:orientation="vertical" >
    <TextView 
        android:layout_width
="wrap_content" android:layout_height="wrap_content" android:text="this is 1" android:textColor="#000000" android:textSize="25sp"/>
</LinearLayout>

fragment2.xml和fragment1.xml很像
第三步:
新建一個Fragment1類,這個類繼承Fragment,記得匯入的包是

import android.support.v4.app.Fragment;
package com.example.staticfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment1, container, false);
        //return super.onCreateView(inflater, container, savedInstanceState);
    }

}

第四步驟,新建Fragment2,同樣繼承Fragment

package com.example.staticfragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return inflater.inflate(R.layout.fragment2, container, false);
    }

}

第五步:修改main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
     >
    <fragment android:id="@+id/frame1"
        android:name="com.example.staticfragment.Fragment1"
        //包名加類名
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment android:id="@+id/frame2"
        android:name="com.example.staticfragment.Fragment2"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"/>


</LinearLayout>

第六步:在MainActivity中呼叫

package com.example.staticfragment;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }  
}

由於上面用的的是V4包,必須將MainActivity派生自FragmentActivity,否則根本無法啟動程式!因為系統的Activity只能用來盛裝系統自帶的Fragment,而無法盛裝V4包中的Fragment,因為系統的Activity根本無法識別V4包中的Fragment,因為這根本就不是一塊的程式碼!如果不使用V4包,使用系統自帶的Fragment則不必將MainActivity派生自FragmentActivity。
第⑦步,看下執行效果:
這裡寫圖片描述

二、動態新增Fragment
你已經學會了如何在XML中使用Fragment,但是這僅僅是Fragment最簡單的功能而已。Fragment真正的強大之處在於可以動態地新增到Activity當中,因此這也是你必須要掌握的東西。當你學會了在程式執行時向Activity新增Fragment,程式的介面就可以定製的更加多樣化。下面我們立刻來看看,如何動態新增Fragment。

還是在上一節程式碼的基礎上修改,開啟activity_main.xml,將其中程式碼全部刪除,改成下面的樣子:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:baselineAligned="false">
     <Button
         android:id="@+id/button1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="顯示Fragment1"/>

     <Button
         android:id="@+id/button2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="顯示Fragment2"/>

     <FrameLayout android:id="@+id/frame"
          android:layout_width="match_parent"
         android:layout_height="match_parent"/>


</LinearLayout>

其它程式碼都沒有動,主要的是在MainActivity裡,點選這兩個按鈕時做的處理:

package com.example.staticfragment;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.Button;

public class MainActivity extends FragmentActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1=(Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                /*1.獲取到FragmentManager,在V4包中通過getSupportFragmentManager,在系統中原生的Fragment是通過getFragmentManager獲得的。
                2.開啟一個事務,通過呼叫beginTransaction方法開啟。
                3.向容器內加入Fragment,一般使用add或者replace方法實現,需要傳入容器的id和Fragment的例項。
                4.提交事務,呼叫commit方法提交。 */
                FragmentManager manager=getSupportFragmentManager();
                FragmentTransaction transaction=manager.beginTransaction();
                Fragment1 fragment1=new Fragment1();
                transaction.add(R.id.frame, fragment1);
                transaction.commit();
            }
        });
        Button button2=(Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                FragmentManager manager=getSupportFragmentManager();
                FragmentTransaction transaction=manager.beginTransaction();
                Fragment2 fragement2=new Fragment2();
                transaction.add(R.id.frame, fragement2);
                transaction.commit();

            }
        });
    }  
}