Android Fragment生命周期和用法解析

时间:2022-10-11 20:56:15


Fragment生命周期图:

Android Fragment生命周期和用法解析

Fragment与Activity生命周期对比图:

Android Fragment生命周期和用法解析

2   生命周期分析

1. 当一个fragment被创建的时候,它会经历以下状态.

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()

2. 当这个fragment对用户可见的时候,它会经历以下状态。

  • onStart()
  • onResume()

3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。

  • onPause()
  • onStop()

4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。

  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy()
  • onDetach()

5. 就像activity一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。

  • onCreate()
  • onCreateView()
  • onActivityCreated()

6. fragment的大部分状态都和activity很相似,但fragment有一些新的状态。

  • onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
  • onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
  • onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
  • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
  • onDetach() —— 当fragment和activity分离的时候,调用这个方法

       一旦activity进入resumed状态(也就是running状态),你就可以*地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。

它内嵌在Activity中,多个Fragment可以把一个Activity分成多个部分,这在大屏幕手机或者平板电脑中会比较多的用到,这样就不用使用多个Activity来切换这么麻烦了。当然Fragment也可以不显示,只在后台处理一些数据,这篇文章中就暂时不谈到这个。以下来看怎么静态地在Activity的布局文件中添加Fragment.

   自定义的Fragment通常要继承Fragment这个类,也有一些特殊的是继承ListFragment,DialogFragment等。继承Fragment类通常要实现三个方法:onCreate(), onCreateView(), onPause();


Activity中定义了两个Fragment,一个是放在左边的LeftFragment,一个是放在右边的RightFragment.以下是代码:首先我们要实现自己的Fragment类

LeftFragment类:


[java]  ​​view plain​​​ ​​​copy​



  1. public class LeftFragment extends Fragment
  2. {
  3. @Override
  4. public void onCreate(Bundle savedInstanceState)
  5. {
  6. super.onCreate(savedInstanceState);
  7. "LeftFragment onCreate");
  8. }

  9. @Override
  10. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  11. {
  12. "LeftFragment onCreateView");

  13. // 第一个参数是这个Fragment将要显示的界面布局,
  14. //Activity,
  15. //Activity
  16. return inflater.inflate(R.layout.leftfragment, container, true);
  17. }

  18. @Override
  19. public void onResume()
  20. {
  21. super.onResume();
  22. "LeftFragment onResume");
  23. }

  24. @Override
  25. public void onPause()
  26. {
  27. super.onPause();
  28. "LeftFragment onPause");
  29. }


  30. @Override
  31. public void onStop()
  32. {
  33. super.onStop();
  34. "LeftFragment onStop");
  35. }
  36. }


这里实现了几种回调函数,主要是为了看清Activity和Fragment生命周期之间的关系.


其中onCreateView()方法是将本Fragment对应的布局返回给Activity的布局,让Activity进行加载.


inflater.inflate(R.layout.leftfragment, container, true)方法中的

第一个参数R.layout.leftfragment是这个Fragment对应的布局文件ID,

第二个参数container是要插入的目标Activity, 

第三个参数是决定这个Fragment是否依附于这个container.

LeftFragment对应的布局文件:



[html]  ​​view plain​​​ ​​​copy​



  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@android:color/holo_orange_dark"
  6. android:orientation="vertical" >

  7. <Button
  8. android:id="@+id/previous_button"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/previous_button" />

  12. <Button
  13. android:id="@+id/next_button"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:text="@string/next_button" />

  17. <Button
  18. android:id="@+id/exit_button"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content"
  21. android:text="@string/exit_button" />

  22. </LinearLayout>



RightFragment类:(和LeftFragment类似)




[java]  ​​view plain​​​ ​​​copy​



  1. public class RightFragment extends Fragment
  2. {
  3. @Override
  4. public void onCreate(Bundle savedInstanceState)
  5. {
  6. super.onCreate(savedInstanceState);
  7. "RightFragment onCreate");
  8. }

  9. @Override
  10. public ViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  11. {
  12. "RightFragment onCreateView");
  13. return inflater.inflate(R.layout.rightfragment, container, true);
  14. }

  15. @Override
  16. public void onResume()
  17. {
  18. super.onResume();
  19. "RightFragment onResume");
  20. }

  21. @Override
  22. public void onPause()
  23. {
  24. super.onPause();
  25. "RightFragment onPause");
  26. }

  27. @Override
  28. public void onStop()
  29. {
  30. super.onStop();
  31. "RightFragment onStop");
  32. }
  33. }


RightFragment对应的布局文件:



[html]  ​​view plain​​​ ​​​copy​



  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >

  6. <TextView
  7. android:id="@+id/show_message"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:background="@android:color/holo_blue_dark"
  11. android:text="@string/show_message" />

  12. </LinearLayout>



最后是Activity的布局文件:



[html]  ​​view plain​​​ ​​​copy​



  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="horizontal" >
  6. 6
  7. 7    <fragment
  8. android:id="@+id/left_fragment"
  9. android:name="com.sunflower.LeftFragment"
  10. 10         android:layout_width="match_parent"
  11. 11         android:layout_height="fill_parent"
  12. 12         android:layout_weight="3" />
  13. 13
  14. 14    <fragment
  15. 15         android:id="@+id/right_fragment"
  16. 16         android:name="com.sunflower.RightFragment"
  17. 17         android:layout_width="match_parent"
  18. 18         android:layout_height="fill_parent"
  19. 19         android:layout_weight="1" />
  20. 20
  21. </LinearLayout>



在Activity中的布局文件中加入Fragment标签,其中android:name属性对应的就是自定义

Fragment类的全名,系统会根据这个调用指定的Fragment的onCreateView()方法来得到这个Fragment的布局,

然后加入Activity中. onCreateView()方法中的Container参数就是这时候传递过去的。


看看显示结果:

Android Fragment生命周期和用法解析



打开程序时生命周期显示:

Android Fragment生命周期和用法解析


按返回键时生命周期显示:

Android Fragment生命周期和用法解析