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、 定義類繼承Fragment
3歪玲、 重寫類中的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(必須重寫)
@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包下的類
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類是哪個(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: 銷毀fragment的view對(duì)象
? onDestroy: fragment銷毀了
? 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.reibang.com/p/708f5983dd82