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,在这个布局里面添加一个按钮:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
然后打开fragment1.xml,为TextView添加一个id:
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
接着打开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的视图了。
Fragment的生命周期&同一Activity下不同Fragment之间的通信,布布扣,bubuko.com