1. 程式人生 > >用Fragment建立模組化元件

用Fragment建立模組化元件

Fragment類似於Activity,有自己的layout佈局,也有一系列相關的生命週期方法。在Activity執行(resumed)期間,它的生命週期可以獨立地控制,但當Activity停止或銷燬時,尚未銷燬的它將一起被停止或銷燬。它是View的子類ViewGroup的子類。

Fragment的生命週期

Activity與Fragment的生命週期

package com.company.app;

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


public
class ExampleFragment extends Fragment { // 建立自身的整個佈局檢視 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 若Activity沒有建立檢視,那麼Fragment也沒必要建立 if(null == container){ return null; } return
inflater.inflate(R.layout.example_fragment, container, false); } // 可選自定義介面。 // 若Activity實現它,則Fragment在需要時可以這樣回撥: // getActivity().onFragmentEvent(); // 也可以在onAttached(Activity)裡先儲存好Activity: // mOnFragmentEventListener = (OnFragmentEventListener) activity; // 然後需要時就可以回撥: // mOnFragmentEventListener.onFragmentEvent();
public interface OnFragmentEventListener { public void onFragmentEvent(); } }

Fragment在Activity的佈局檔案中可定義如下:

<fragment
    android:id="@+id/example_fragment"
    android:name="com.company.app.ExampleFragment"
    android:layout_width="寬度"
    android:layout_height="高度" />

系統會自動例項化對應的Fragment子類物件,並呼叫其onCreateView方法來給其佈局。

也可在Activity的佈局檔案中先定義一個ViewGroup容器:

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="寬度"
    android:layout_height="高度" />

並且在Activity中實現如下程式碼:

// 1.獲取Fragment管理器
FragmentManager fragmentManager  = getFragmentManager();

// 2.獲取Fragment事務
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

ExampleFragment exampleFragment = new ExampleFragment();

// 3a.新增Fragment控制元件到一個ViewGroup容器中。
// 第一個引數是ViewGroup容器的ID,
// 可以是Fragment自身的或者是容納它的ViewGroup容器的,下同
fragmentTransaction.add(R.id.fragment_container, exampleFragment);

// 3b.或者刪除
fragmentTransaction.remove(exampleFragment);

// 3c.或者替換。相當於remove和add二合一。
fragmentTransaction.replace(R.id.fragment_container, new ExampleFragment());

// 可選操作:把被刪除或者被替換的舊Fragment加入棧。
// 這樣舊Fragment將會被停止而不是被銷燬,以備導航返回。
// 當呼叫FragmentManager.popBackStack(),
// 或者使用者點選螢幕底部的返回鍵時,就可以導航回這個舊Fragment。
fragmentTransaction.addToBackStack(null);

// 3d.或者隱藏
fragmentTransaction.hide(exampleFragment);

// 3e.或者顯示
fragmentTransaction.show(exampleFragment);

// 4.提交Fragment事務,非同步更新介面
fragmentTransaction.commit();

/* ------------------------------------------------ */

// 從Activity中獲取Fragment例項。
fragmentManager.findFragmentById(R.id.xxx);