1. 程式人生 > >Android 元件之Fragment建立小述

Android 元件之Fragment建立小述

一、概述

Fragment是一種控制器物件,Activity可委派它完成一些任務。通常這些任務就是管理使用者介面,受管的介面可以是一整屏或者是整屏的一部分。Activity檢視含有可供Fragment檢視插入的位置,如果有多個Fragment要插入,Activity檢視也可提供多個位置。根據使用者或裝置的需要,Activity介面可以在執行時組裝甚至重新組裝,Activity自身並不具備這樣的靈活性,Activity檢視可以在執行時切換,但控制檢視的程式碼必須在Activity中實現,各個Activity和特定的使用者螢幕牢牢地繫結在了一起。正是採用這種Fragment而不是Activity進行應用的UI管理,使用Fragment及Activity來組裝或重新組裝使用者介面,在整個生命週期過程中,技術上來說Activity檢視並沒有改變,所以我們就可以繞開Android系統Activity規則的限制,這段定義摘自

《Android 程式設計權威指南》,這裡就不過多討論基礎概念了,我們主要來看下經常被用到的Fragment建立方法。

二、靜態新增Fragment

這種方式新增主要分為兩步,首先建立待新增的Fragment並關聯其相應的xml佈局;之後在Activity佈局xml檔案之中新增我們需要的fragment,這樣我們就可以在Activity程式碼中直接使用該Fragment了,很簡單,但這樣也就必然會喪失其靈活性,因為這樣相當於將fragment的檢視與activity的檢視牢牢綁在了一起,在Activity中我們根本無法動態切換fragment檢視,下面我們來簡單看下例子:

這是我們建立的碎片MyFragment1,因為Fragment是在API11

(Android 3.0)才被引入的,如果需要向後相容舊版本裝置,那麼我們可以使用v4支援庫內的android.support.v4.app.Fragment,該類可以使用在任何API4級及更高的版本上

    public class MyFragment1 extends Fragment {

        //這裡的Fragment為android.app.Fragment
        @Nullable @Override public View onCreateView(LayoutInflater inflater
                , @Nullable ViewGroup container
                ,
Bundle savedInstanceState) { //第一個引數:佈局的資源id //第二個引數:檢視的父檢視,通常我們需要父檢視來正確配置元件 //第三個引數:告知佈局生成器是否將生成的佈局新增給父檢視 View view = inflater.inflate(R.layout.fragment_layout1, container, false); return view; } }

這是我們上面MyFragment1所關聯的佈局fragment_layout1,沒有特殊的地方,只是很簡單的佈局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#0ff">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#787878"
            android:textSize="20sp"
            android:text="這是靜態新增Fragment"
            android:layout_centerInParent="true"
            />
    </RelativeLayout>

這是我們的Activity佈局activity_main,這裡需要注意的是name屬性

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <fragment
            android:id="@+id/my_fragment1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="zmj.myfragments.MyFragment1"
            android:layout_marginTop="15dp"
            />
    </RelativeLayout>

這是我們的活動MainActivity,在這裡也存在一個版本問題,在Android 3.0之後的版本中,我們可以直接使用Activity來管理fragment,但是如果我們想要相容老版本,則必須使用FragmentActivity類,因為在Android 3.0之前的版本中,Activity的內部還沒有實現管理Fragment的程式碼,我們這裡的AppCompatActivity就繼承自FragmentActivity類

    public class MainActivity extends AppCompatActivity {

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

三、動態新增Fragment

動態新增Fragment主要分為三個步驟,首先建立待新增的Fragment並關聯其相應的xml佈局;之後在Activity佈局xml檔案之中新增< FrameLayout >容器檢視用來託管我們需要的Fragment;最後在Activity程式碼中新增我們需要的fragment。下面是我們的Fragment2,關於版本相容問題在靜態新增時已經說了,我們來直接看下程式碼

    public class MyFragment2 extends Fragment {

        //這裡的Fragment為android.app.Fragment
        @Nullable @Override public View onCreateView(LayoutInflater inflater
                , @Nullable ViewGroup container
                , Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_layout2, container, false);
            return view;
        }
    }

這是我們碎片MyFragment2所需要的佈局fragment_layout2,只是簡單的佈局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#787878"
            android:textSize="20sp"
            android:text="這是動態新增Fragment"
            android:layout_centerInParent="true"
            />
    </RelativeLayout>

這是我們的活動MainActivity的佈局activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/my_fragment2"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:background="#f0f"
            />
    </RelativeLayout>

這是我們的活動MainActivity,關於版本問題在靜態新增Fragment的介紹中已經提過了,在這裡就不贅述了,相對於靜態新增Fragment來說,動態新增Fragment就要靈活多了,我們可以在執行時動態的控制Fragment,也可以新增fragment,可以用其他的fragment替換當前的fragment,也可以移除fragment

    public class MainActivity extends AppCompatActivity {

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

        private void addFragment() {
            //這裡的android.app.FragmentManager
            FragmentManager fm = getFragmentManager();
            MyFragment2 fragment2 = (MyFragment2) fm.findFragmentById(R.id.my_fragment2);
            if(fragment2 == null){
                fragment2 = new MyFragment2();
                fm.beginTransaction()
                        .add(R.id.my_fragment2, fragment2)
                        .commit();
            }
        }
    }

四、總結

本節主要簡單的介紹了建立Fragment的方法,如果想要檢視更多Fragment的基礎知識,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。