Fragment的使用

1.fragment的基本使用方法
分為靜態(tài)加載和動(dòng)態(tài)加載:
(1)靜態(tài)加載
即通過(guò)在XML文件中定義的方法定義fragment,可通過(guò) <fragment/>標(biāo)簽來(lái)實(shí)現(xiàn)。

fragment中需要指定 android:name 屬性,它指定了在layout中實(shí)例化的Fragment類。另外需要注意的是, 在靜態(tài)加載的方法中必須為Fragment添加一個(gè)唯一的標(biāo)識(shí)(可以是id也可以是tag)

<fragment android:id="@+id/main_fragment"
    android:name="com.example.fragmenttest.Fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</fragment>

注:如果使用的是fragment標(biāo)簽,那么在android:name屬性中指定的Fragment類必須是 android.app.Fragment,
而不能是android.support.v4.app.Fragment;
否則將會(huì)報(bào)錯(cuò)InflateException。(為什么???)

報(bào)錯(cuò)的原因是因?yàn)?,F(xiàn)ragment所在的Activity中使用的是Activity,而不是v4包中的FragmentActivity。


Q:怎么在XML中使用support.v4包中的Fragment?

app.fragment和v4.fragment都是可以使用<fragment>標(biāo)簽的
如果使用app.fragment則沒有什么特殊的地方,其所屬的Activity直接繼承Activity即可。
當(dāng)v4.fragment使用<fragment>標(biāo)簽的時(shí)候就要特別注意了:
當(dāng)這個(gè)Activity的布局中有<fragment>標(biāo)簽的時(shí)候,這個(gè)Activity必須繼承FragmentActivity,否則就會(huì)報(bào)錯(cuò)


盡量不要用app包中的fragment,因?yàn)檫@個(gè)是在3.0之后才有的,支持的版本太高,在低版本中是是用不了的。android.support.v4.app.Fragment:可以兼容到1.6的版本,

[http://blog.csdn.net/a465456465/article/details/10415211]


2.動(dòng)態(tài)加載
根據(jù)用戶交互,對(duì)Fragment進(jìn)行添加、移除、替換等動(dòng)作。
基本模式:

Fragment1 fragment1 = new Fragment1();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.main_fragcontainer, fragment1).commit();

對(duì)于動(dòng)態(tài)加載,使用supportv4包中的Fragment則比較簡(jiǎn)單,除了所需要引用的相關(guān)類都是用v4包中的類以外,思路基本一致。一個(gè)需要額外注意的就是,所使用的Activity應(yīng)該是v4包中的FragmentActivity,此外在獲取FragmentManager時(shí),應(yīng)該使用getSupportFragmentManager.

FragmentManager manager = getSupportFragmentManager();

fragment生命周期
Fragment的生命周期

1、 onAttach();//當(dāng)fragment被添加到activity中時(shí)會(huì)回調(diào)這個(gè)方法;只會(huì)調(diào)用一次
2、 onCreate();//在fragment創(chuàng)建的時(shí)候回調(diào)這個(gè)方法;只會(huì)調(diào)用一次;
3、 onCreateView()://每次創(chuàng)建都會(huì)繪制Fragment的View組件時(shí)調(diào)用該方法,相當(dāng)于fragment綁定一個(gè)布局,布局文件轉(zhuǎn)換成view返回回來(lái);
4、 onActivityCreated();//fragment所在的activity啟動(dòng)完成后調(diào)用;
5、 onStart():啟動(dòng)Fragment時(shí)會(huì)被回調(diào),
6、 onResume()方法,調(diào)用onStart()方法后面一定會(huì)調(diào)用這個(gè)方法,恢復(fù)fragment時(shí)回調(diào)
7、 onPause():暫停Fragment
8、 onStop();//停止Fragment
9、 onDestroyView():銷毀Fragment所包含的View組件,與onCreateView相對(duì)應(yīng)
10、 onDestroy():銷毀Fragment時(shí)會(huì)被回調(diào)
11、 onDetach():Fragment從Activity中刪除時(shí)回調(diào)這個(gè)方法,并且只調(diào)用一次
啟動(dòng)fragment
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()
屏幕鎖屏
onPause()->onStop()
屏幕解鎖
onStart()->onResume()
第一個(gè)fragment切換到第二個(gè)fragment

第一個(gè) :
onPause()->onStop()->onDestoryView()->onDestory()->onDetach();
第二個(gè):
onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()

Fragment生命周期


fragment 生命周期
fragment 生命周期

Activity生命周期


Activity生命周期
Activity生命周期

兩者對(duì)比


Activity和Fragment聲明周期對(duì)比
Activity和Fragment聲明周期對(duì)比

Activity 和 Fragment通信

1.Fragment和Activity通信
(1)Activity向Fragment發(fā)送數(shù)據(jù)
在Activity中調(diào)用Fragment的setArguments(Bundle bundle)方法,在Fragment中通過(guò)getArguments()方法,即可得到Activity發(fā)送的數(shù)據(jù)。

MainActivity中
fragment1.setArguments(bundle);

Fragment中
TextView tv=(TextView) view.findViewById(R.id.frag_tv);
    tv.setText(getArguments().getString("name"));

2.Fragment向Activity通信
需要在Fragment中定義一個(gè)interface接口,再讓包含該Fragment的Activity實(shí)現(xiàn)該方法,這樣Fragment中可以調(diào)用該方法將數(shù)據(jù)傳遞給activity。

需要在onAttach方法中獲得該接口的activity實(shí)例。

interface FragInterface{
    void doso(String s);
}

@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    mInterface=(FragInterface)activity;
    super.onAttach(activity);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view = inflater.inflate(R.layout.fragement, container,false);
    TextView tv=(TextView) view.findViewById(R.id.frag_tv);
    tv.setText(getArguments().getString("name"));
    mInterface.doso("thank!");
    return view;
}

通過(guò)在Fragment中調(diào)用interface中的方法,即可通過(guò)該方法的參數(shù)把這個(gè)數(shù)據(jù)傳送到了Activity中。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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