當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Fragment與activity間的通信
Fragment與activity間的通信
時(shí)間:2018-09-21 來源:未知
上次介紹了Fragment的使用,本文主要介紹Fragment與所屬Activity之間的通信以及生命周期
1.3.1 activity向Fragment傳遞數(shù)據(jù)
Fragment與所屬的activity之間怎么進(jìn)行數(shù)據(jù)的傳遞呢?
下面我們我們?cè)谥骰顒?dòng)中再添加一個(gè)EditText和一個(gè)Button按鈕,在Fragment03中添加一個(gè)TextView,當(dāng)我們?cè)邳c(diǎn)擊這個(gè)按鈕后,把EditText中的數(shù)據(jù)顯示到Fragment03中的TextView,這就實(shí)現(xiàn)了activity向Fragment中傳遞數(shù)據(jù)。代碼如下:
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 "/>
這里我們?cè)赼ctivity main.xml中添加EditText和Button,并為Button設(shè)置了點(diǎn)擊屬性
public void click4 ( View v) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
String text = et_main . getText (). toString ();
fg3. settext ( text );
}
上面我們?cè)谥骰顒?dòng)中添加按鈕點(diǎn)擊方法,按鈕點(diǎn)擊后先獲得EditText中的內(nèi)容,在拿到Fragment03的對(duì)象fg3,然后調(diào)用settext的方法,這個(gè)方法是Fragment03類的一個(gè)方法,在這個(gè)方法中設(shè)置TextView的內(nèi)容。代碼如下:
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 );
}
}
我們?cè)贓ditText中輸入Hello,點(diǎn)擊傳遞按鈕后,就會(huì)在Fragment03中顯示Hello,如下圖:

這樣就實(shí)現(xiàn)了activity向Fragment傳遞數(shù)據(jù)。
1.3.2 Fragment向activity傳遞數(shù)據(jù)
下面我們?cè)僭贔ragment01中創(chuàng)建一個(gè)EditText和Button,當(dāng)我們點(diǎn)擊按鈕后,就會(huì)把EditText中的數(shù)據(jù)傳遞到活動(dòng)中EditText中并顯示,代碼如下:
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傳遞=""/ >
接著我們要在主活動(dòng)MainActivity中定義一個(gè)方法,用于顯示主活動(dòng)EditText中的數(shù)據(jù)
public void settext ( String text ) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
et_main . setText ( text );
}
那么我們到底怎么樣把數(shù)據(jù)從Fragment01中傳入到主活動(dòng)中呢?我們通過調(diào)用getActivity獲得與這個(gè)Fargment相關(guān)聯(lián)的活動(dòng),然后調(diào)用活動(dòng)的settext的方法顯示數(shù)據(jù)。代碼如下:
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;
}
如圖,當(dāng)我們?cè)贔ragment01的EditText中輸入World,點(diǎn)擊傳遞按鈕后,World就會(huì)顯示到主活動(dòng)的EditText中

- 這樣我們就實(shí)現(xiàn)Fragment01向Activity傳遞數(shù)據(jù)。
1.4 Fragment的生命周期
和活動(dòng)一樣,F(xiàn)ragment也有自己的生命周期,并且它和活動(dòng)的生命周期基本上一樣。
Fragment類提供了一系列的回調(diào)方法,其中活動(dòng)中有的回調(diào)方法,碎片中幾乎都有,不過碎片還提供一些附加的回調(diào)方法
1. onAttach()
當(dāng)碎片和活動(dòng)建立關(guān)聯(lián)的時(shí)候調(diào)用。
2. onCreateView()
為碎片創(chuàng)建視圖(加載布局)時(shí)調(diào)用。
3. onActivityCreated()
確保與碎片相關(guān)聯(lián)的活動(dòng)一定已經(jīng)創(chuàng)建完畢的時(shí)候調(diào)用。
4. onDestroyView()
當(dāng)與碎片關(guān)聯(lián)的視圖被移除的時(shí)候調(diào)用。
5. onDetach()
當(dāng)碎片和活動(dòng)解除關(guān)聯(lián)的時(shí)候調(diào)用。
Fragment完整的生命周期如下

下面我們通過例子實(shí)踐一下,這里我們使用的是前面Fragment簡(jiǎn)單使用的案例,代碼如
下:
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 ");
}
}
重新運(yùn)行程序,打印信息如下:

可以看到,當(dāng)RightFragment第一次被加載到屏幕上時(shí),會(huì)依次執(zhí)行onAttach()、onCreate()、onCreateView()、onActivityCreated()法。
然后點(diǎn)擊LeftFragment中的按鈕,此時(shí)打印如下:

由于AnotherRightFragment替換了RightFragment,此時(shí)的RightFragment進(jìn)入了停止?fàn)顟B(tài),因此onPause()、onStop()和onDestroyView()方法會(huì)得到執(zhí)行。當(dāng)然如果在替換的時(shí)候沒有調(diào)用addToBackStack()方法,此時(shí)的RightFragment就會(huì)進(jìn)入銷毀狀態(tài),onDestroy()和onDetach()方
法就會(huì)得到執(zhí)行。
接著按下Back鍵,RightFragment會(huì)重新回到屏幕,打印信息如下:

由于RightFragment重新回
到了運(yùn)行狀態(tài),因此onActivityCreated()、onStart()和onResume()方法會(huì)得到執(zhí)行。注意
此時(shí)onCreate()和onCreateView()方法并不會(huì)執(zhí)行,因?yàn)槲覀兘柚薬ddToBackStack()方法
使得RightFragment和它的視圖并沒有銷毀。
再次按下Back鍵退出程序,打印信息如下:

依次會(huì)執(zhí)行onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()方法,終
將活動(dòng)和碎片一起銷毀。這樣碎片完整的生命周期你也體驗(yàn)了一遍,是不是理解得更加深刻了?

