Fragment使用總結(jié)
Android基礎(chǔ):Fragment,看這篇就夠了--懶加載
什么是fragment
Fragment(碎片)就是小型的Activity,它是在Android3.0時(shí)出現(xiàn)的。Fragment是表現(xiàn)Activity中UI的一個(gè)行為或者一部分。
Fragment必須被嵌入到一個(gè)activity中。它們的生命周期直接受其宿主activity的生命周期影響。
定義fragment
1、 為Fragment定義一個(gè)布局
2、 定義類(lèi)繼承Fragment
3、 重寫(xiě)類(lèi)中的onCreateView方法,返回一個(gè)View對(duì)象作為當(dāng)前Fragment的布局。
fragment第一次繪制它的用戶界面的時(shí)候,系統(tǒng)會(huì)調(diào)用onCreateView()方法。為了繪制fragment的UI,此方法必須返回一個(gè)作為fragment布局的根的view。如果fragment不提供UI,可以返回null。
public class Fragment1 extends Fragment {
//初始化當(dāng)前Fragment的內(nèi)容onCreateView(必須重寫(xiě))
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
//將布轉(zhuǎn)成view
// 參數(shù)1 要填充的布局資源
View view = inflater.inflate(R.layout.fragment1, null);
//返回view
return view;
}
}
向下兼容
Fragment是在Android 3.0才推出的,若想在3.0的低版本下使用Fragment,則需要執(zhí)行下面2步:
1、 把所有Fragment和FragmentManager改成support-v4包下的類(lèi)
2、 把Activity的繼承改為FragmentActivity(support-v4包下的)
將fragment添加到activity中
在布局中聲明
<fragment
android:id="@+id/fmt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.itheima.fragment.TitleFragment"
/>
注意:代碼中的四個(gè)屬性是必須的要給的,“android:name”屬性:指定了在layout中實(shí)例化的Fragment類(lèi)是哪個(gè)。
當(dāng)系統(tǒng)創(chuàng)建這個(gè)activity layout時(shí),它實(shí)例化每一個(gè)在layout中指定的Fragment,并調(diào)用它們的onCreateView()方法,來(lái)獲取每一個(gè)Fragment的layout,系統(tǒng)將從Fragment返回的View 直接插入到<fragment>元素所在的地方
每一個(gè)fragment都需要一個(gè)唯一的標(biāo)識(shí),如果activity重啟,系統(tǒng)可以用來(lái)恢復(fù)Fragment,并且可以用id來(lái)捕獲Fragment來(lái)處理事務(wù),
有3種方法來(lái)為一個(gè)fragment提供一個(gè)ID,具體如下所示:
1.為android:id屬性提供一個(gè)唯一ID;
2.為android:tag屬性提供一個(gè)唯一字符串;
3.如果以上2個(gè)你都沒(méi)有提供,系統(tǒng)將使用容器view的ID;
動(dòng)態(tài)創(chuàng)建—切換fragment
要在activity中管理Fragment,需要使用FragmentManager可以通過(guò)調(diào)用activity的getFragmentManager()取得它的實(shí)例。
replace
public void news(View view) {
//獲取Fragment管理器對(duì)象
FragmentManager manager = getFragmentManager();
//開(kāi)啟事務(wù)
FragmentTransaction transaction = manager.beginTransaction();
//將FrameLayout(viewgroup)控件替換成Fragment對(duì)象
transaction.replace(R.id.frame, new NewsFragment());
//提交事務(wù)
transaction.commit();
}
add+hide+show
FragmentManager mManager = getSupportFragmentManager();
FragmentTransaction mTransaction = mManager.beginTransaction();
if (from == -1 && !baseFragments.get(index).isAdded()) {
mTransaction.add(R.id.fl_main, baseFragments.get(index), tags[index]).commit();
mCurrentIndex = index;
} else {
if (from != index) {
if (!baseFragments.get(index).isAdded()) { // 先判斷是否被add過(guò)
mTransaction.hide(baseFragments.get(from))
.add(R.id.fl_main, baseFragments.get(index), tags[index]).commit(); // 隱藏當(dāng)前的fragment,add下一個(gè)到Activity中
} else {
mTransaction.hide(baseFragments.get(from)).show(baseFragments.get(index)).commit(); // 隱藏當(dāng)前的fragment,顯示下一個(gè)
}
mCurrentIndex = index;
}
}
注意:
1.fragment的生命周期與activity綁定著,add多個(gè)fragment后,每當(dāng)activity的onstart執(zhí)行,多個(gè)fragment的onstart也會(huì)執(zhí)行,執(zhí)行順序和add的順序相同,并且(只有最上面的fragment可見(jiàn)哦),接著activity執(zhí)行onPause方法,多個(gè)fragment執(zhí)行onPause。其他與activity生命周期一致的同上。
2.使用radiogroup+radiobutton組合來(lái)切換(已經(jīng)add過(guò)的fragment)fragment不執(zhí)行fragment的onstart方法
生命周期
Fragment的生命周期和activity生命周期很像,其生命周期方法如下所示。
? onAttach:綁定到activity
? onCreate:創(chuàng)建fragment
? onCreateView: 創(chuàng)建fragment的布局
? onActivityCreated: activity創(chuàng)建完成后
? onStart: 可見(jiàn)(暫且這么描述), 不可交互
? onResume: 可見(jiàn), 可交互
? onPause: 部分可見(jiàn), 不可交互
? onStop:不可見(jiàn)
? onDestroyView: 銷(xiāo)毀fragment的view對(duì)象
? onDestroy: fragment銷(xiāo)毀了
? onDetach: 從activity解綁了
生命周期注意
fragment間通信--標(biāo)記fragment
動(dòng)態(tài)添加fragment---replace—的第三個(gè)參數(shù)—設(shè)置tag
beginTransaction.replace(R.id.ll1, new Fragment1(), "f2");
通過(guò)getFragmentManager—找到tag標(biāo)記的fragment0—調(diào)方法
//replace()方法最后一個(gè)參數(shù)是給Fragment設(shè)置的tag。
Fragment2 fragment2 = (Fragment2) getActivity().getFragmentManager().findFragmentByTag("f2");
//通過(guò)fragment對(duì)象, 調(diào)用方法修改
fragment2.updateText("aaaaa");
增加
當(dāng)fragment被用戶可見(jiàn)時(shí),setUserVisibleHint()會(huì)調(diào)用且傳入true值,當(dāng)fragment不被用戶可見(jiàn)時(shí),setUserVisibleHint()則得到false值
Android使用newInstance()實(shí)例化fragment&setArguments()傳遞參數(shù)
http://blog.csdn.net/czhpxl007/article/details/51277319
http://www.itdecent.cn/p/708f5983dd82