1. 程式人生 > >Fragment常用內容回顧

Fragment常用內容回顧

動態新增fragment

動態新增碎片基本使用
private void replaceFragment(Fragment fragment){
    FragmentManager fragmentManager=getSupportFragmentManager();
    FragmentTransaction transaction=fragmentManager.beginTransaction();
    transaction.replace(R.id.right_layout,fragment);
    transaction.commit();
}

程式碼解釋:
- 首先需要建立待新增的fragment例項,也就是方法中傳遞過來的引數。
- 獲取FragmentManager,在活動中可以直接呼叫getSupportFragmentManager()方法得到
- 使用FragmentManager開啟一個事務,使用beginTransaction()方法開啟
- 向容器內容新增或替換碎片,這裡使用replace()方法實現,需要傳入容器的id和待新增的fragment。(注意這裡的容器指的是要存放這個fragment例項的viewGroup)
- 提交事務,呼叫commit()方法來實現

使用事務向容器中新增例項的時候,repalce與add有什麼區別?

在使用add()函式的時候,一般伴隨著hide()或者show();
先說一下每個函式的概念:
- add():向活動中新增一個fragment,這個fragment在activity容器中有他自己的檢視
- show():顯示一個以前被隱藏的Fragment,前提是fragment已經新增到了活動中,顯示fragment的view
- hide():隱藏一個已經存在的fragment,前提是fragment已經新增到了活動中,隱藏fragment的view
- replace():執行的是一個remove(Fragment)–>add()操作過程

共同點:
二者都可以解決Fragment直接切換時的閃動問題,
hide()方法僅僅是隱藏了Fragment的View,而沒有銷燬View,show()方法僅僅是顯示之前隱藏的View。
replace是先移除再新增重新建立fragment
add是新增新的fragment

如何在Fragment中模擬返回棧,也就是從一個Fragment可以返回到另一個Fragment?

FragmentTracsaction中提供了一個addToBackStack()方法,用於將一個事務新增到返回棧中。

//上面程式碼commit之前新增
transaction.addToBackStack(null
);

如果之前有一個fragment,這時候在按back按鍵,程式並不會直接退出,而是返回到上一個fragment。

Fragment中巢狀Fragment

開發過程中Fragment巢狀Fragment不顯示問題(當時場景應用在巢狀的融雲聊天列表Fragment):

原因是因為在獲取FragmentManager例項的時候使用的getSupportFragmentManager,巢狀Fragment**一定要使用getChildFragmentManager**,謹記。

FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction();
        mConversationListFragment = initConversationList();
        fragmentTransaction.add(R.id.lin_fragment_chat, mConversationListFragment, "chat");
        fragmentTransaction.addToBackStack("chat");
        fragmentTransaction.commitAllowingStateLoss();