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

参考连接为:点击打开链接

 Fragment的使用在目前的开发中会经常用到,因为他有自己完整的生命周期,更方便和灵活的使用,已改以前自定义View带来的维护成本。使用Fragment需要熟悉几个类,包括FragmentActivity、FragmentManager、 FragmentTranscation,一个FragmentActivity可以包含多个Fragment,谁来管理? FragmentManager就起到了作用。做Fragment的增加、删除、替换的时候,事务FragmentTranslation 来负责执行。

        getFragmentManager()和getSupportFragmentManager()的区别很容易理解,android的v4扩展包中的FragmentActivity中获取FragmentManager使用的就是getSupportFragmentManager(),android.app中获取管理类的方法就是getFragmentManager()。

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

        

  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. <!--<fragment-->
  7. <!--android:name="com.duomi.oops.postandnews.fragment.InputAddPhotoFragment"-->
  8. <!--android:id="@+id/inputAddPhotoFragment"-->
  9. <!--android:layout_width="match_parent"-->
  10. <!--android:layout_height="match_parent" />-->
  11. </FrameLayout>

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

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

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


        最后我们来看一下getFragmentManager()的源码,它是属于FragmentActivity,代码如下:

  1. /**
  2. * Return the FragmentManager for interacting with fragments associated
  3. * with this activity.
  4. */
  5. public FragmentManager getSupportFragmentManager() {
  6. return mFragments;
  7. }
        看它的官方注释,是为了获取能管理和当前Activity有关联的Fragment的FragmentManager。

         

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



阅读更多
换一批

没有更多推荐了,返回首页