fragment之间的通信,fragment和Activity生命周期之间的关系
通过上一篇浅显的学习了一下,怎么在Activity中添加fragment。在介绍fragment之间的通信之前,我们来回顾一些fragment的生命周期:
Activity的生命周期会影响fragment的生命周期的,针对Activity的每一个生命周期的回调都会有一个类似的针对Fragment的回调,当Activity收到onPause()回调时,在Activity中每个Fragment都会收到onPause()回调。
看到fragment的生命周期是不是有种似成相识感觉,对,它和Activity的生命周期很像。对一些常用的生命周期函数做个说明:
onAttach()
当Fragment已经跟Activity关联上的时候,这个回调被调用。Activity会作为onAttach()回调方法的参数来传递。
onCreateView()
创建跟Fragment关联的视图层时,调用这个回调方法。
onActivityCreated()
当Activity的onCreate()方法执行完之后,调用这个回调方法。
onDestroyView()
当跟Fragment关联的视图层正在被删除时,调用这个回调方法。
onDetach()
当从Activity中解除Fragment的关联时,调用这个回调方法。
对于activity的理解可以参考这篇博文:http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
Activity和fragment有个很大的区别是:
Activity在onPause()后会自己进入到周期Stack当中, 而fragment需要调用addToBackStack()方法后才能回到backStack当中去,然后再一次启动
下面就通过一个例子来说明fragment之间怎么通信的和fragment与activity之间的一些关系:
Mainactivity:
public class MainActivity extends FragmentActivity implements
interactiveActivity { // 别忘了要继承接口 private TextView content = null; // ContentFragment中的TextView @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("MainActivity--->>onCreat()开始");
ContentFragment contentfragment = new ContentFragment();
TopFragment topfragment = new TopFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.ActivityContent, contentfragment);
ft.add(R.id.Top, topfragment);
ft.commit();
System.out.println("MainActivity--->>onCreat()结束");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public void showContent(int i) {
switch (i) {
case 1:
content.setText("第一页");
break;
case 2:
content.setText("第二页");
break;
case 3:
content.setText("第三页");
break;
default:
break;
}
} @Override
protected void onStart() {
super.onStart();
System.out.println("MainActivity--->>onStart()");
//在MainActivity,oncreate()后,两个fragment还需要调用自己onCreatView
content = (TextView) findViewById(R.id.content);
} @Override
protected void onResume() {
super.onResume();
System.out.println("MainActivity--->>onResume()");
} }
Mainactivity对应的XML文件activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <LinearLayout
android:id="@+id/Top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" /> <LinearLayout
android:id="@+id/ActivityContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" /> </LinearLayout>
TopFragment的class
public class TopFragment extends Fragment implements OnClickListener { public TopFragment() {
} private interactiveActivity interact;
private Button btn1;
private Button btn2;
private Button btn3; // 创建一个接口用于与activity之间进行交互
public interface interactiveActivity {
// 根据i的不同,对content 内容进行修改
public void showContent(int i);
} /** Fragment第一次附属于Activity时调用,在onCreate之前调用 */
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
System.out.println("TopFragment--->>onAttach()");
interact = (interactiveActivity) activity;
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("TopFragment--->>onCreate()");
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { System.out.println("TopFragment--->>onCreateView()");
// 在获取了xml后对其中的控件进行实例化
return inflater.inflate(R.layout.top_fragment, container, false); } @Override
public void onStart() {
super.onStart();
System.out.println("TopFragment--->>onStart");
/*
* getActivity:Return the Activity this fragment is currently associated
* with getActivity()就是返回对应XML的Activity
*/
btn1 = (Button) getActivity().findViewById(R.id.one);
btn2 = (Button) getActivity().findViewById(R.id.two);
btn3 = (Button) getActivity().findViewById(R.id.three);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this); } @Override
public void onResume() {
super.onResume();
System.out.println("TopFragment--->>onResume"); } // 按钮的点击监听
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.one:
interact.showContent(1);
break;
case R.id.two:
interact.showContent(2);
break;
case R.id.three:
interact.showContent(3);
break;
default:
break; }
} }
TopFragment所引用的top_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <Button
android:id="@+id/one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第一页" /> <Button
android:id="@+id/two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第二页" /> <Button
android:id="@+id/three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第三页" /> </LinearLayout>
ContentFragment的class:
public class ContentFragment extends Fragment { public ContentFragment() {
} @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("ContentFragment----->>onCreat()");
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { System.out.println("ContentFragment----->>onCreatView()");
View view = (View) inflater.inflate(R.layout.content_fragment,
container, false);
return view;
} @Override
public void onStart() {
super.onStart();
System.out.println("ContentFragment----->>onStart()");
} @Override
public void onResume() { super.onResume();
System.out.println("ContentFragment----->>onResume()");
} }
ContentFragment所引用的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="内容页" /> </LinearLayout>
运行后的效果:
点击按钮显示对应的页数.
在看看打印出来数据:可以了解到activity和fragment的生命周期是有先后顺序的。
Activity的onCreate()------>>fragment的Attach()---->>fragment的onCreate()------>>fragment的onCreateView()--->>(在多个fragment的onCreateView()执行完后,就又开始执行每个fragment的
onStart())----->>Activity的onStart() ----->>Activity的onResume() ------>>fragment的onResume()
因为在onCreate()当中不能获得fragment的中的控件,因为要等fragement执行了onCreateView()后才能获取,所以只能在onCreateView()后的Activity的生命函数当中才能对fragment的控件进行实例化