iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
1

FragmentTransaction

增加 Fragment (add)


var manager = supportFragmentManager

        val a = FragmentA()

        val transaction = manager.beginTransaction()

        transaction.add(R.id.group,a,"A")

        transaction.addToBackStack("addA")

        transaction.commit()

移除 Fragment (remove)


        val a = manager.findFragmentByTag("A")

        val transaction = manager.beginTransaction()

        if(a != null){

            transaction.remove(a)

            transaction.addToBackStack("removeA")

            transaction.commit()


        }

        else{

            Toast.makeText(this,"The fragment A was not added before ",Toast.LENGTH_LONG).show()


        }

detach an added Fragment from an Activity (detach)



        val a = manager.findFragmentByTag("A")

        val transaction = manager.beginTransaction()

        if(a != null){

            transaction.detach(a)

            transaction.addToBackStack("detachA")

            transaction.commit()


        }

re-attach a Fragment that was detached to the Activity (attach)

調用attach之前需要先有調用過detach


        val a = manager.findFragmentByTag("A")

        val transaction = manager.beginTransaction()

        if(a != null){

            transaction.attach(a)

            transaction.addToBackStack("attachA")

            transaction.commit()

        }

替換成另一個 Fragment (replace)


        val a = FragmentA()

        val transaction = manager.beginTransaction()

        transaction.replace(R.id.group,a,"A")

        transaction.addToBackStack("replacewithA")

        transaction.commit

popBackStack

popBackStack()

彈出最頂部的 Transaction


popBackStack()


popBackStack (String name , int flags)

name :是指某次調用addToBackStack 所加上 的name

flags: 只有 0 或 POP_BACK_STACK_INCLUSIVE

flags為0時,彈出該 transAction 以上的 transAction

flags為1時(POP_BACK_STACK_INCLUSIVE),彈出該transAction (包括該transAction )以上的transAction 。

  1. 彈出特定 Transaction 上面全部的 Transaction (不包括 此Transaction)

  1. 彈出特定 Transaction 上面全部的 Transaction (包括此Transaction)

Fragment lifecycle during FragmentTransaction

關於FragmentTransaction 調用下面幾個 method的作用,及所對應的生命週期

  • add :

    onAttach->
    onCreate->
    onCreateView->
    onActivityCreated->
    onStart->
    onResume

  • show & hide :

    不會觸發任何生命週期函數

    • hide:隱藏已經存在的Fragment,但是僅僅對已經添加到父容器(ViewGroup)中的Fragment有效,隱藏Fragment的View
    • show: 顯示一個以前被隱藏的Fragment,這僅僅對已經添加到activity中的Fragment有關,顯示Fragment的View
  • remove :

onPause->
onStop->
onDestoryView->
onDestory->
onDetach

  • replace :

    可拆分為add和remove,

    • replace會先查找FragmentManager中是否包含相同mContainerId 的fragment,如果有就先remove它,然後再add它。

    • 注意它是根據containerViewId來進行比較的,並不是依據對像是否相等來判斷的。

  • detach :

    將Fragment的視圖銷毀,Fragment的狀態沒有被銷毀,還是被FragmentMenager管理。

    (在調用detach之前需要先通過add添加Fragment)
    onPause->
    onStop->
    onDestoryView

  • attach :

    Fragment的view重新加載到UI視圖中,並顯示出來

    (調用attach之前需要先調用detach)
    onCreateView->
    onActivityCreated->
    onStarted->
    onResumed

  • popBackStack()

下面舉個例子:

假如我現在 用 fragmentB 代替 另一個 fragment A 並把這段 Transaction 加入 BackStack中 如下:

fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

隨後我按了返回鍵,此時上面的transaction 會被彈出 backstack , 因為 是用 fragmentB 代替 fragment A , 所以在反轉這個 transaction 情況下 會需要 回復fragment A ,

假如 fragment A 還存在 , 則 fragment A 會從onStart() 和 onResume() 開始 , 如果 fragment A 已經銷毀了(destroyed) 則會需要 再產生 一個 fragment A 此時會從 onAttach 開始

而 fragmentB 如果在 transaction commit 之前是不存在, 他在 transaction期間 從 onAttach 開始 , 此時 fragmentB 在調用 popBackStack() 之後 會被銷毀 , 進入 Destoryed 的階段, 如果 fragmentB 在此次 transaction commit 之前是已經存在 ,則會進入 stopped ,

  • addToBackStack():

    一般當我們按下返回鍵,這個 Fragment 會進入 destroyed 階段,如果在 FragmentTransaction( removing this Fragment)加入 BackStack 中,此Fragment 是進入 stopped 階段 , 下次要使用者再跳回這個Fragment 時,此 Fragment 會進入 OnResume 階段 .


上一篇
[Day 19] Android Activity lifecycle
下一篇
[Day 21] Android Toolbar
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言