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