Fragment與activity間的通信(xin)
時(shi)間:2018-09-21 來源:未(wei)知(zhi)
上次介(jie)紹了Fragment的(de)使用,本文主要介(jie)紹Fragment與所(suo)屬Activity之間的(de)通信以及(ji)生命周期
1.3.1 activity向(xiang)Fragment傳遞數據(ju)
Fragment與所屬的activity之間怎么(me)進行數據的傳(chuan)遞呢?
下面我(wo)們我(wo)們在(zai)(zai)主活動(dong)中(zhong)再添加一個EditText和一個Button按鈕,在(zai)(zai)Fragment03中(zhong)添加一個TextView,當我(wo)們在(zai)(zai)點擊這個按鈕后,把EditText中(zhong)的(de)數據顯示到Fragment03中(zhong)的(de)TextView,這就實現了activity向Fragment中(zhong)傳遞數據。代碼如(ru)下:
android :id ="@+id/ et_main "
android : layout_width =" match_parent "
android : layout_height =" wrap_content "/>
android : layout_width =" wrap_content "
android : layout_height =" wrap_content "
android : text傳遞=""
android : onClick =" click4 "/>
這里我們(men)在activity main.xml中添加EditText和Button,并(bing)為Button設置了點擊屬性(xing)
public void click4 ( View v) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
String text = et_main . getText (). toString ();
fg3. settext ( text );
}
上面我們在(zai)主活動中添加按(an)鈕點(dian)擊方(fang)(fang)法,按(an)鈕點(dian)擊后先獲得EditText中的內容(rong),在(zai)拿到(dao)Fragment03的對象fg3,然后調(diao)用settext的方(fang)(fang)法,這(zhe)(zhe)個(ge)方(fang)(fang)法是(shi)Fragment03類的一個(ge)方(fang)(fang)法,在(zai)這(zhe)(zhe)個(ge)方(fang)(fang)法中設(she)置TextView的內容(rong)。代碼如下:
public class Fragment03 extends Fragment {
private TextView tv;
@Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container ,
Bundle savedInstanceState ) {
// TODO Auto - generated method stub
View v = inflater . inflate (R. layout . fragment03 , null );
tv = ( TextView ) v. findViewById (R.id.tv );
return v;
}
public void settext ( String text ) {
tv. setText ( text );
}
}
我們(men)在EditText中(zhong)輸(shu)入Hello,點(dian)擊傳遞按鈕后,就會在Fragment03中(zhong)顯(xian)示(shi)Hello,如下圖:

這樣就實現了activity向Fragment傳遞數(shu)據。
1.3.2 Fragment向(xiang)activity傳遞數據(ju)
下面我(wo)們再在Fragment01中(zhong)創(chuang)建一個EditText和Button,當我(wo)們點(dian)擊按鈕后,就(jiu)會把EditText中(zhong)的數據傳遞到活動(dong)中(zhong)EditText中(zhong)并顯示,代碼如下:
android :id ="@+id/ et_frag "
android : layout_width =" wrap_content "
android : layout_height =" wrap_content "/>
android :id ="@+id/bt"
android : layout_width =" wrap_content "
android : layout_height =" wrap_content "
android : text傳遞=""/ >
接著我們(men)要在(zai)主活動(dong)MainActivity中(zhong)定義一(yi)個(ge)方法,用于顯(xian)示主活動(dong)EditText中(zhong)的(de)數據
public void settext ( String text ) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
et_main . setText ( text );
}
那么我們到底(di)怎么樣(yang)把數據從Fragment01中(zhong)傳入到主(zhu)活(huo)動中(zhong)呢?我們通過調(diao)用getActivity獲(huo)得與這個Fargment相關聯的活(huo)動,然后調(diao)用活(huo)動的settext的方法顯示(shi)數據。代碼如(ru)下:
public View onCreateView ( LayoutInflater inflater , ViewGroup container ,
Bundle savedInstanceState ) {
View v = inflater . inflate (R. layout . fragment01 , null );
Button bt = ( Button ) v. findViewById (R.id.bt );
et_frag = ( EditText ) v. findViewById (R.id. et_frag );
bt. setOnClickListener (new OnClickListener () {
@Override
public void onClick ( View v) {
// TODO Auto - generated method stub
String text = et_frag . getText (). toString ();
(( MainActivity ) getActivity ()). settext ( text );
}
});
return v;
}
如圖,當我們在(zai)Fragment01的EditText中輸入World,點擊傳遞按鈕后,World就會顯示到(dao)主活動(dong)的EditText中

- 這樣(yang)我(wo)們就實現(xian)Fragment01向Activity傳遞數(shu)據。
1.4 Fragment的生命周期(qi)
和活動一(yi)樣(yang),Fragment也(ye)有自己的生(sheng)命(ming)周(zhou)期,并且它和活動的生(sheng)命(ming)周(zhou)期基(ji)本上一(yi)樣(yang)。
Fragment類提供了(le)一系列的回(hui)(hui)調方(fang)法(fa),其中活動(dong)中有(you)的回(hui)(hui)調方(fang)法(fa),碎片中幾乎都(dou)有(you),不過碎片還提供一些附加的回(hui)(hui)調方(fang)法(fa)
1. onAttach()
當碎片和活動建(jian)立(li)關聯(lian)的(de)時候調(diao)用。
2. onCreateView()
為碎片(pian)創建(jian)視圖(加載布局)時調用。
3. onActivityCreated()
確保與碎片相關聯的活動一定已經創建完畢(bi)的時候調用。
4. onDestroyView()
當與碎片關聯的(de)(de)視圖被移除(chu)的(de)(de)時候調用。
5. onDetach()
當碎片和活動解除關聯的時候調用。
Fragment完(wan)整的生命(ming)周期如下

下(xia)面我們(men)通過(guo)例子實踐一下(xia),這里我們(men)使用的是前面Fragment簡單使用的案例,代碼(ma)如
下:
public class RightFragment extends Fragment {
public static final String TAG = " RightFragment ";
@Override
public void onAttach ( Activity activity ) {
super . onAttach ( activity );
Log.d(TAG , " onAttach ");
}
@Override
public void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
Log.d(TAG , " onCreate ");
}
@Override
public View onCreateView ( LayoutInflater inflater , ViewGroup container ,
Bundle savedInstanceState ) {
Log.d(TAG , " onCreateView ");
View view = inflater . inflate (R. layout . right_fragment , container , false );
return view ;
}
@Override
public void onActivityCreated ( Bundle savedInstanceState ) {
super . onActivityCreated ( savedInstanceState );
Log.d(TAG , " onActivityCreated ");
}
@Override
public void onStart () {
super . onStart ();
Log.d(TAG , " onStart ");
}
@Override
public void onResume () {
super . onResume ();
Log.d(TAG , " onResume ");
}
@Override
public void onPause () {
super . onPause ();
Log.d(TAG , " onPause ");
}
@Override
public void onStop () {
super . onStop ();
Log.d(TAG , " onStop ");
}
@Override
public void onDestroyView () {
super . onDestroyView ();
Log.d(TAG , " onDestroyView ");
}
@Override
public void onDestroy () {
super . onDestroy ();
Log.d(TAG , " onDestroy ");
}
@Override
public void onDetach () {
-
super . onDetach ();
Log.d(TAG , " onDetach ");
}
}
重新運行程序,打(da)印信息(xi)如下:

可以看到,當RightFragment第一次被加(jia)載到屏幕上時,會依次執行onAttach()、onCreate()、onCreateView()、onActivityCreated()法。
然后(hou)點擊LeftFragment中的按鈕,此(ci)時打印如下:

由于(yu)AnotherRightFragment替換了RightFragment,此(ci)時(shi)的(de)RightFragment進入了停止狀態(tai)(tai),因此(ci)onPause()、onStop()和onDestroyView()方法(fa)會得到執行。當然如果在替換的(de)時(shi)候沒有調(diao)用addToBackStack()方法(fa),此(ci)時(shi)的(de)RightFragment就會進入銷毀狀態(tai)(tai),onDestroy()和onDetach()方
法就(jiu)會得(de)到執行(xing)。
接著按下(xia)Back鍵(jian),RightFragment會重(zhong)新回到屏幕,打印信(xin)息如下(xia):

由于RightFragment重新回
到了運(yun)行(xing)狀態,因此onActivityCreated()、onStart()和(he)onResume()方法會得到執(zhi)行(xing)。注意
此時onCreate()和onCreateView()方(fang)法并不(bu)會執行(xing),因為我(wo)們借(jie)助了addToBackStack()方(fang)法
使(shi)得RightFragment和(he)它的視圖并沒有銷毀。
再次按(an)下Back鍵退出程序,打印(yin)信息如下:

依(yi)次(ci)會執行onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()方法(fa),終
將活(huo)動和(he)碎片(pian)一起銷毀(hui)。這樣碎片(pian)完整(zheng)的生命周期你也(ye)體(ti)驗了一遍(bian),是(shi)不(bu)是(shi)理解得更加(jia)深刻(ke)了?

