讲师博文
Fragment与activity间的通信 来源 : 华清远见     2018-10-28

上次介绍了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()方法,终

将活动和碎片一起销毁。这样碎片完整的生命周期你也体验了一遍,是不是理解得更加深刻了?

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:长安.ARM体系结构.七日谈

下一篇:SOAP嵌入式linux下的应用(一)

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号