上次介紹了Fragment的使用,本文主要介紹Fragment與所屬Activity之間的通信以及生命周期
1.3.1 activity向Fragment傳遞數(shù)據(jù)
Fragment與所屬的activity之間怎么進行數(shù)據(jù)的傳遞呢?
下面我們我們在主活動中再添加一個EditText和一個Button按鈕,在Fragment03中添加一個TextView,當我們在點擊這個按鈕后,把EditText中的數(shù)據(jù)顯示到Fragment03中的TextView,這就實現(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 "/>
這里我們在activity main.xml中添加EditText和Button,并為Button設(shè)置了點擊屬性
public void click4 ( View v) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
String text = et_main . getText (). toString ();
fg3. settext ( text );
}
上面我們在主活動中添加按鈕點擊方法,按鈕點擊后先獲得EditText中的內(nèi)容,在拿到Fragment03的對象fg3,然后調(diào)用settext的方法,這個方法是Fragment03類的一個方法,在這個方法中設(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 );
}
}
我們在EditText中輸入Hello,點擊傳遞按鈕后,就會在Fragment03中顯示Hello,如下圖:
這樣就實現(xiàn)了activity向Fragment傳遞數(shù)據(jù)。
1.3.2 Fragment向activity傳遞數(shù)據(jù)
下面我們再在Fragment01中創(chuàng)建一個EditText和Button,當我們點擊按鈕后,就會把EditText中的數(shù)據(jù)傳遞到活動中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傳遞=""/ >
接著我們要在主活動MainActivity中定義一個方法,用于顯示主活動EditText中的數(shù)據(jù)
public void settext ( String text ) {
EditText et_main = ( EditText ) findViewById (R.id. et_main );
et_main . setText ( text );
}
那么我們到底怎么樣把數(shù)據(jù)從Fragment01中傳入到主活動中呢?我們通過調(diào)用getActivity獲得與這個Fargment相關(guān)聯(lián)的活動,然后調(diào)用活動的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;
}
如圖,當我們在Fragment01的EditText中輸入World,點擊傳遞按鈕后,World就會顯示到主活動的EditText中
- 這樣我們就實現(xiàn)Fragment01向Activity傳遞數(shù)據(jù)。
1.4 Fragment的生命周期
和活動一樣,F(xiàn)ragment也有自己的生命周期,并且它和活動的生命周期基本上一樣。
Fragment類提供了一系列的回調(diào)方法,其中活動中有的回調(diào)方法,碎片中幾乎都有,不過碎片還提供一些附加的回調(diào)方法
1. onAttach()
當碎片和活動建立關(guān)聯(lián)的時候調(diào)用。
2. onCreateView()
為碎片創(chuàng)建視圖(加載布局)時調(diào)用。
3. onActivityCreated()
確保與碎片相關(guān)聯(lián)的活動一定已經(jīng)創(chuàng)建完畢的時候調(diào)用。
4. onDestroyView()
當與碎片關(guān)聯(lián)的視圖被移除的時候調(diào)用。
5. onDetach()
當碎片和活動解除關(guān)聯(lián)的時候調(diào)用。
Fragment完整的生命周期如下
下面我們通過例子實踐一下,這里我們使用的是前面Fragment簡單使用的案例,代碼如
下:
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 ");
}
}
重新運行程序,打印信息如下:
可以看到,當RightFragment第一次被加載到屏幕上時,會依次執(zhí)行onAttach()、onCreate()、onCreateView()、onActivityCreated()法。
然后點擊LeftFragment中的按鈕,此時打印如下:
由于AnotherRightFragment替換了RightFragment,此時的RightFragment進入了停止狀態(tài),因此onPause()、onStop()和onDestroyView()方法會得到執(zhí)行。當然如果在替換的時候沒有調(diào)用addToBackStack()方法,此時的RightFragment就會進入銷毀狀態(tài),onDestroy()和onDetach()方
法就會得到執(zhí)行。
接著按下Back鍵,RightFragment會重新回到屏幕,打印信息如下:
由于RightFragment重新回
到了運行狀態(tài),因此onActivityCreated()、onStart()和onResume()方法會得到執(zhí)行。注意
此時onCreate()和onCreateView()方法并不會執(zhí)行,因為我們借助了addToBackStack()方法
使得RightFragment和它的視圖并沒有銷毀。
再次按下Back鍵退出程序,打印信息如下:
依次會執(zhí)行onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()方法,終
將活動和碎片一起銷毀。這樣碎片完整的生命周期你也體驗了一遍,是不是理解得更加深刻了?