Android學習|探究碎片Fragment

《第一行代碼》系列讀書筆記

Fragment簡介
Fragment生命週期
Fragment的使用方式
Fragment與Activity之間進行通信


1.Fragment簡介

  • 碎片(Fragment)是一種可以嵌入在活動當中的UI片段,它能讓程序更加合理和充分地利用大屏幕的空間,因而在平板上應用的非常廣泛。

    學習Fragment的時候可以聯繫之前學習過的Activity,因爲它們有很多相似點:都可包含佈局,有自己的生命週期,Fragment可看似迷你活動,它可作爲Activity界面的組成部分,可在Activity運行中實現動態地加入、移除和交換。一個Activity中可同時出現多個Fragment,一個Fragment也可在多個Activity中使用。

2.Fragment生命週期

  • 在這裏插入圖片描述

    onAttach():當Fragment和Activity建立關聯時調用
    onCreateView():當Fragment創建視圖時調用
    onActivityCreated():當與Fragment相關聯的Activity完成onCreate()之後調用
    onDestroyView():在Fragment中的佈局被移除時調用
    onDetach():當Fragment和Activity解除關聯時調用

    Activity的FragmentManager負責調用隊列中Fragment的生命週期方法,只要Fragment的狀態與Activity的狀態保持了同步,託管Activity的FragmentManager便會繼續調用其他生命週期方法以繼續保持Fragment與Activity的狀態一致

    Fragment生命週期與Activity生命週期的一個關鍵區別就在於,Fragment的生命週期方法是由託管Activity而不是操作系統調用的。Activity中生命週期方法都是protected,而Fragment都是public。

3.Fragment的使用方式

  • (1)靜態加載:

    第一步:新建.xml,爲Fragment指定一個佈局。

    第二步:新建一個Fragment類並繼承Fragment,然後重寫onCreateView()方法,這個方法裏通過LayoutInflater的inflate()方法將剛剛定義的佈局加載進來並得到一個View,再return這個View。

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.another_right_fragment, container, false);
            return view;
        }
    

    第三步:新建.xml,作爲Activity的佈局,使用<
    fragment>標籤添加碎片,並且一定要有android:name屬性且值爲被加載的Fragment類的包名.類名完整形式。

    <fragment
            android:id="@+id/left_fragment"
            android:name="com.example.fragmenttest.LeftFragment"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    

    第四步:在MainActivity中加載main佈局。現在MyFragment就完成了靜態加載到MainActivity中,這時碎片裏的控件自然也是活動的一個部分。

  • (2)動態加載
    第一步,創建待添加的碎片實例。

    第二步,先用getFragmentManager()方法獲取一個FragmentManager對象。

    第三步,開啓一個事務,通過beginTransaction()獲取一個FragmentTransaction的實例。

    第四步,向容器內添加或替換碎片,一般使用replace()方法實現,需要傳入容器的id和待添加的碎片實例。

    第五步:提交事務,調用beginTransaction.commit()提交。

       private void replaceFragment(Fragment fragment) {
               FragmentManager fragmentManager = getSupportFragmentManager();
               FragmentTransaction transaction = fragmentManager.beginTransaction();
               transaction.replace(R.id.right_layout, fragment);
               transaction.addToBackStack(null);//模擬返回棧
               transaction.commit();
           }
    
  • 限定符(Qualifiers)
    在這裏插入圖片描述
    在這裏插入圖片描述
    最小寬度限定符允許我們對屏幕的寬度制定一個最小值(以dp爲單位),然後以這個最小值爲臨界點,屏幕大於這個值就加載一個佈局,小於這個值就加載另一個佈局。

4.Fragment與Activity之間進行通信

  • 在活動中可以通過調用FragmentManager的findFragmentById()方法來得到相應碎片的實例,繼而可以調用碎片裏的方法。
    如果想得到靜態加載碎片的實例,可使用

    getFragmentManager(). findFragmentById();
    

    如果想得到動態加載碎片的實例,代碼如下:

    fragmentManager(). findFragmentById();
    

    在碎片中也可以通過調用getActivity()方法來得到和當前碎片相關聯的活動實例,進而調用活動裏的方法

    MainActivity activity=(MainActivity)getActivity();
    

    於是碎片和活動可以很方便地進行通信了。再想一想碎片和碎片之間如何進行通信?先在一個碎片中可以得到與它相關聯的活動,然後再通過這個活動去獲取另外一個碎片的實例,這樣實現了不同碎片之間的通信了。

發佈了45 篇原創文章 · 獲贊 8 · 訪問量 7752
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章