上次介绍了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()方法,终
将活动和碎片一起销毁。这样碎片完整的生命周期你也体验了一遍,是不是理解得更加深刻了?