关于getChildFragmentManager()、 getFragmentManager()、getSupportFragmentManager()的使用

来源:互联网 发布:sony walkman 软件 编辑:程序博客网 时间:2024/04/30 18:54

  1getFragmentManagergetSupportFragmentManager的区别

         Android Android 3.0API级别 11)中引入了片段(Fragment),所以3.0版本之后有了fragmentAPI,所以直接通过getFragmentManager()方法就能获取到FragmentManager对象,并且直接继承自Activity就嵌入使用fragment了。而3.0以下版本是没有fragmentapi,所以必须借助V4包里面的getSupportFragmentManager()方法来间接获取FragmentManager()对象。所以:

      getFragmentManagergetSupportFragmentManager的区别是:

        3.0
以下:使用getSupportFragmentManager()
        3.0
以上:使用getFragmentManager()

       Android 在 Android 3.0(API 级别 11)中引入了片段(Fragment),主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。



2、getChildFragmentManager()和getFragmentManager()的区别



     getChildFragmentManager()和getFragmentManager()属于两个不同的类,前者属于Fragment,后者属于Activity,看源码

  1.  
  2.     * Return a private FragmentManager for placing and managing Fragments 
  3.     * inside of this Fragment. 
  4.     */  
  5.    final public FragmentManager getChildFragmentManager() {  
  6.        if (mChildFragmentManager == null) {  
  7.            instantiateChildFragmentManager();  
  8.            if (mState >= RESUMED) {  
  9.                mChildFragmentManager.dispatchResume();  
  10.            } else if (mState >= STARTED) {  
  11.                mChildFragmentManager.dispatchStart();  
  12.            } else if (mState >= ACTIVITY_CREATED) {  
  13.                mChildFragmentManager.dispatchActivityCreated();  
  14.            } else if (mState >= CREATED) {  
  15.                mChildFragmentManager.dispatchCreate();  
  16.            }  
  17.        }  
  18.        return mChildFragmentManager;  
  19.    }  

 

        Android官方对它的解释是,返回一个FragmentManager为了设置和管理当前Fragment内部的Fragment的们。举个例子,在我的Fragment布局中添加了一个Fragment容器,我的目的是在Fragment执行的过程中动态的添加一个Fragment,并且对他进行操作,上XML代码:

  1. <FrameLayout  
  2.                 android:id="@+id/frameContainer"  
  3.                 android:layout_width="match_parent"  
  4.                 android:layout_height="238dp"  
  5.                 android:visibility="gone">  
  6.   
  7.                 <!--<fragment-->  
  8.                     <!--android:name="com.duomi.oops.postandnews.fragment.InputAddPhotoFragment"-->  
  9.                     <!--android:id="@+id/inputAddPhotoFragment"-->  
  10.                     <!--android:layout_width="match_parent"-->  
  11.                     <!--android:layout_height="match_parent" />-->  
  12.             </FrameLayout>  

     动态添加Fragment区别于在上面的代码中注销掉的部分。为了满足我上面说的需求和条件,我需要这样写我的代码:

    1. fragmentManager =  getChildFragmentManager();  
    2.   
    3. inputAddPhotoFragment = new InputAddPhotoFragment();  
    4.   
    5. FragmentTransaction ft = fragmentManager.beginTransaction();  
    6. ft.add(R.id.frameContainer, inputAddPhotoFragment);  
    7. ft.commitAllowingStateLoss();  
    8. fragmentManager.executePendingTransactions();  

      因为InputAddPhotoFragment属于我当期的Fragment,所以需要用我当前FragmentFragmentManager去管理,而不是使用ActivityFragmentManager去管理。使用到的获取方法就是getChildFragmetManager()。动态添加Fragment区别于在上面的代码中注销掉的部分。为了满足我上面说的需求和条件,我需要这样写我的代码:

    1. fragmentManager =  getChildFragmentManager();  
    2.   
    3. inputAddPhotoFragment = new InputAddPhotoFragment();  
    4.   FragmentTransaction ft = fragmentManager.beginTransaction();  
    5. ft.add(R.id.frameContainer, inputAddPhotoFragment);  
    6. ft.commitAllowingStateLoss();  
    7. fragmentManager.executePendingTransactions();  

     因为InputAddPhotoFragment属于我当期的Fragment,所以需要用我当前FragmentFragmentManager去管理,而不是使用ActivityFragmentManager去管理。使用到的获取方法就是getChildFragmetManager()

   总结,需要管理相互独立的并且隶属于ActivityFragment使用FragmentManager(),而在Fragment中动态的添加Fragment要使用getChildFragmetManager()来管理。

 

 

0 0