1、getFragmentManager和getSupportFragmentManager的区别
Android 在 Android 3.0(API 级别 11)中引入了片段(Fragment),所以3.0版本之后有了fragment的API,所以直接通过getFragmentManager()方法就能获取到FragmentManager对象,并且直接继承自Activity就嵌入使用fragment了。而3.0以下版本是没有fragment的api ,所以必须借助V4包里面的getSupportFragmentManager()方法来间接获取FragmentManager()对象。所以:
getFragmentManager和getSupportFragmentManager的区别是:
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,看源码
- * Return a private FragmentManager for placing and managing Fragments
- * inside of this Fragment.
- */
- final public FragmentManager getChildFragmentManager() {
- if (mChildFragmentManager == null) {
- instantiateChildFragmentManager();
- if (mState >= RESUMED) {
- mChildFragmentManager.dispatchResume();
- } else if (mState >= STARTED) {
- mChildFragmentManager.dispatchStart();
- } else if (mState >= ACTIVITY_CREATED) {
- mChildFragmentManager.dispatchActivityCreated();
- } else if (mState >= CREATED) {
- mChildFragmentManager.dispatchCreate();
- }
- }
- return mChildFragmentManager;
- }
Android官方对它的解释是,返回一个FragmentManager为了设置和管理当前Fragment内部的Fragment的们。举个例子,在我的Fragment布局中添加了一个Fragment容器,我的目的是在Fragment执行的过程中动态的添加一个Fragment,并且对他进行操作,上XML代码:
- <FrameLayout
- android:id="@+id/frameContainer"
- android:layout_width="match_parent"
- android:layout_height="238dp"
- android:visibility="gone">
- <!--<fragment-->
- <!--android:name="com.duomi.oops.postandnews.fragment.InputAddPhotoFragment"-->
- <!--android:id="@+id/inputAddPhotoFragment"-->
- <!--android:layout_width="match_parent"-->
- <!--android:layout_height="match_parent" />-->
- </FrameLayout>
动态添加Fragment区别于在上面的代码中注销掉的部分。为了满足我上面说的需求和条件,我需要这样写我的代码:
- fragmentManager = getChildFragmentManager();
- inputAddPhotoFragment = new InputAddPhotoFragment();
- FragmentTransaction ft = fragmentManager.beginTransaction();
- ft.add(R.id.frameContainer, inputAddPhotoFragment);
- ft.commitAllowingStateLoss();
- fragmentManager.executePendingTransactions();
因为InputAddPhotoFragment属于我当期的Fragment,所以需要用我当前Fragment的FragmentManager去管理,而不是使用Activity的FragmentManager去管理。使用到的获取方法就是getChildFragmetManager()。动态添加Fragment区别于在上面的代码中注销掉的部分。为了满足我上面说的需求和条件,我需要这样写我的代码:
- fragmentManager = getChildFragmentManager();
- inputAddPhotoFragment = new InputAddPhotoFragment();
- FragmentTransaction ft = fragmentManager.beginTransaction();
- ft.add(R.id.frameContainer, inputAddPhotoFragment);
- ft.commitAllowingStateLoss();
- fragmentManager.executePendingTransactions();
因为InputAddPhotoFragment属于我当期的Fragment,所以需要用我当前Fragment的FragmentManager去管理,而不是使用Activity的FragmentManager去管理。使用到的获取方法就是getChildFragmetManager()。
总结,需要管理相互独立的并且隶属于Activity的Fragment使用FragmentManager(),而在Fragment中动态的添加Fragment要使用getChildFragmetManager()来管理。