Fragment的生命周期&同一Activity下不同Fragment之间的通信

Android开发:碎片Fragment完全解析(2)

Fragment的生命周期

和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方式来瞧一瞧Fragment的生命周期是什么样的:

 1 publicclass Fragment1 extends Fragment {   
 2 publicstaticfinal String TAG = "Fragment1";   
 3 @Override 
 4 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
 5         Log.d(TAG, "onCreateView");   
 6 return inflater.inflate(R.layout.fragment1, container, false);   
 7     }   
 8 @Override 
 9 publicvoid onAttach(Activity activity) {   
10 super.onAttach(activity);   
11         Log.d(TAG, "onAttach");   
12     }   
13 @Override 
14 publicvoid onCreate(Bundle savedInstanceState) {   
15 super.onCreate(savedInstanceState);   
16         Log.d(TAG, "onCreate");   
17     }   
18 @Override 
19 publicvoid onActivityCreated(Bundle savedInstanceState) {   
20 super.onActivityCreated(savedInstanceState);   
21         Log.d(TAG, "onActivityCreated");   
22     }   
23 @Override 
24 publicvoid onStart() {   
25 super.onStart();   
26         Log.d(TAG, "onStart");   
27     }   
28 @Override 
29 publicvoid onResume() {   
30 super.onResume();   
31         Log.d(TAG, "onResume");   
32     }   
33 @Override 
34 publicvoid onPause() {   
35 super.onPause();   
36         Log.d(TAG, "onPause");   
37     }   
38 @Override 
39 publicvoid onStop() {   
40 super.onStop();   
41         Log.d(TAG, "onStop");   
42     }   
43 @Override 
44 publicvoid onDestroyView() {   
45 super.onDestroyView();   
46         Log.d(TAG, "onDestroyView");   
47     }   
48 @Override 
49 publicvoid onDestroy() {   
50 super.onDestroy();   
51         Log.d(TAG, "onDestroy");   
52     }   
53 @Override 
54 publicvoid onDetach() {   
55 super.onDetach();   
56         Log.d(TAG, "onDetach");   
57     }   
58 }   

可以看到,上面的代码在每个生命周期的方法里都打印了日志,然后我们来运行一下程序,可以看到打印日志如下:

这时点击一下home键,打印日志如下:

如果你再重新进入进入程序,打印日志如下:

然后点击back键退出程序,打印日志如下:

看到这里,我相信大多数朋友已经非常明白了,因为这和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,这里需要重点介绍一下:

  • onAttach方法:Fragment和Activity建立关联的时候调用。

  • onCreateView方法:为Fragment加载布局时调用。

  • onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

  • onDestroyView方法:Fragment中的布局被移除时调用。

  • onDetach方法:Fragment和Activity解除关联的时候调用。

Fragment之间进行通信

通常情况下,Activity都会包含多个Fragment,这时多个Fragment之间如何进行通信就是个非常重要的问题了。我们通过一个例子来看一下,如何在一个Fragment中去访问另一个Fragment的视图。

还是在第一节代码的基础上修改,首先打开fragment2.xml,在这个布局里面添加一个按钮:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="#ffff00"> 
<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="This is fragment 2" 
android:textColor="#000000" 
android:textSize="25sp"/> 
<Button 
android:id="@+id/button" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Get fragment1 text" 
/> 
</LinearLayout> 

然后打开fragment1.xml,为TextView添加一个id:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="#00ff00"> 
<TextView 
android:id="@+id/fragment1_text" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="This is fragment 1" 
android:textColor="#000000" 
android:textSize="25sp"/> 
</LinearLayout> 

接着打开Fragment2.java,添加onActivityCreated方法,并处理按钮的点击事件:

publicclass Fragment2 extends Fragment {   
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
return inflater.inflate(R.layout.fragment2, container, false);   
    }   
@Override 
publicvoid onActivityCreated(Bundle savedInstanceState) {   
super.onActivityCreated(savedInstanceState);   
        Button button = (Button) getActivity().findViewById(R.id.button);   
        button.setOnClickListener(new OnClickListener() {   
@Override 
publicvoid onClick(View v) {   
                TextView textView = (TextView) getActivity().findViewById(R.id.fragment1_text);   
                Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();   
            }   
        });   
    }   
}   

现在运行一下程序,并点击一下fragment2上的按钮,效果如下图所示:

我们可以看到,在fragment2中成功获取到了fragment1中的视图,并弹出Toast。这是怎么实现的呢?主要都是通过getActivity 这个方法实现的。getActivity方法可以让Fragment获取到关联的Activity,然后再调用Activity的 findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2014-06-11 17:08  找工作中  阅读(333)  评论(0编辑  收藏  举报