Fragment 詳解


Fragment 表示 Activity 中的行爲或用戶界面部分。您能夠將多個片斷組合在一個 Activity 中來構建多窗格 UI,以及在多個 Activity 中重複使用某個片斷。您能夠將片斷視爲 Activity 的模塊化組成部分,它具備本身的生命週期,能接收本身的輸入事件,而且您能夠在 Activity 運行時添加或移除片斷(有點像您能夠在不一樣 Activity 中重複使用的「子 Activity」)。android

目錄

-生命週期git

-簡單使用github

-Fragment 通訊bash

-源碼分析ide

生命週期

Fragment 和 activity 同樣,也是有四種狀態模塊化

Resumed 當前 Fragment 位於前臺,用戶可見,能夠得到焦點;源碼分析

Paused 另外一個 Activity 處於前臺並擁有焦點, 可是該 Fragment 所在的 Activity 仍然可見(前臺 Activity 局部透明或者沒有覆蓋整個屏幕),不過不能得到焦點;佈局

Stopped 要麼是宿主 Activity 已經被中止, 要麼是 Fragment 從 Activity 被移除但被添加到回退棧中;中止狀態的 Fragment 仍然活着(全部狀態和成員信息被系統保持着)。 然而, 它對用戶再也不可見, 而且若是 Activity 被銷燬,它也會被銷燬;ui

Destroyed 只能等待被回收。this

Fragment生命週期

附上 Activity 生命週期進行對比

Activity生命週期

Fragment 比 Activity 多了幾個額外的生命週期回調方法:

onAttach() 當碎片和活動創建關聯時調用。(得到 activity 的傳遞的值) onCreateView() 爲碎片建立視圖調用就是加載佈局時。 onActivityCreated() 確保與碎片相關聯的活動必定已經建立完畢的時候調用。 onDestroyView() 當與碎片的視圖被移除的時候調用。 onDetach()當碎片與活動解除關聯的時候調用。

簡單使用

Fragment 添加到 Activity 中有兩種方式一種是靜態添加,一種是動態添加

靜態添加

在對應的 Activity 中的 xml 中添加,實例以下

<fragment
    android:id="@+id/a_fragment"
    android:name="com.madreain.AFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</fragment>
複製代碼

動態添加

通常都是把 xml 佈局中的 FrameLayout 做爲 Fragment 顯示的區域,而後經過 tab 欄按鈕來進行多個 Fragment 的切換

Fragment 具體動態添加可參考這個庫

有兩篇文章很好的講解了Fragment使用中遇到的問題

Fragment 全解析系列(一):那些年踩過的坑

Fragment 全解析系列(二):正確的使用姿式

FragmentTransaction有一些基本方法,下面給出調用這些方法時,Fragment生命週期的變化:

add(): onAttach()->…->onResume()。 remove(): onPause()->…->onDetach()。 replace(): 至關於舊Fragment調用remove(),新Fragment調用add()。 show(): 不調用任何生命週期方法,調用該方法的前提是要顯示的 Fragment已經被添加到容器,只是純粹把Fragment UI的setVisibility爲true。 hide(): 不調用任何生命週期方法,調用該方法的前提是要顯示的Fragment已經被添加到容器,只是純粹把Fragment UI的setVisibility爲false。 detach(): onPause()->onStop()->onDestroyView()。UI從佈局中移除,可是仍然被FragmentManager管理。 attach(): onCreateView()->onStart()->onResume()。

Fragment 通訊

1.Fragment向Activity傳遞數據 1).接口回掉的方法 Fragment中定義接口,Activity中實現該接口。

AFragment

public interface OnFragmentCallback {
    void onCallback(Object value);
}
複製代碼

AActivity

public class AActivity extends AppCompatActivity implements AFragment.OnFragmentCallback{

    @Override
    public void onCallback(Object value){
        //todo獲取Fragment 向 Activity傳遞的數據
    }

}

複製代碼

2).廣播方式

廣播具體實現參考 BroadcastReciver詳解

2.Activity 向 Fragment 傳遞數據(Bundle 和 setArguments(bundle))

1).Fragment建立時傳遞數據

在AActivity調用時

AFragment aFragment = AFragment.newInstance(object);
aFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
aFragment.show(getSupportFragmentManager(), AFragment.class.getName());
複製代碼

在AFragment中

public class AFragment extends DialogFragment {

    private Object object;

    /**
    * 建立時傳入的對象,可傳入多個參數
    */
    public static AFragment newInstance(Object object) {
        AFragment fragment = new AFragment();
        Bundle bundle = new Bundle();
        bundle.putBoolean("object", object);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //省略其餘代碼
        Bundle bundle = getArguments();
        //獲取到傳入的值進行顯示等使用
        object = bundle.getString("object");
        return v;
    }
}    
複製代碼

2).Fragment建立後設置數據

在AFragment中

public class AFragment extends DialogFragment {

    private Object object;

    public void setObject(Object object) { 
        this.object = object;
    }

}
複製代碼

在AActivity中設置值

afragment.setObject("object")

複製代碼

3).廣播方式同上

3.Fragment之間通訊

1).經過Activity做爲中介,參考Fragment->Activity傳遞參數,而後ctivity->Fragment傳遞參數

2).廣播方式同上

源碼分析

後續文章將講解,盡情期待

相關文章
相關標籤/搜索