fragment

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容