在哪里调用getChildFragmentManager()?

问题

根据Google的文档:

您现在可以将碎片embedded到碎片中。 这对于您想要将dynamic和可重用UI组件放入本身为dynamic且可重用的UI组件的各种情况很有用。 例如,如果使用ViewPager创build左右滑动并占用大部分屏幕空间的片段,则现在可以将片段插入到每个片段页面中。 要嵌套一个片段,只需在要添加片段的片段上调用getChildFragmentManager()即可。 这将返回一个FragmentManager,您可以像使用顶级活动一样使用FragmentManager来创build片段事务。 例如,下面是一些在现有的Fragment类中添加片段的代码:

Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit(); 

所以我有(例如) TestFragment ,看起来像:

 public class TestFragment extends Fragment { private View mFragmentView; private FrameLayout mFrameLayout; public HistoryFragment() { super(); } @Override public View onCreateView(LayoutInflater pInflater, ViewGroup pViewGroup, Bundle pBundle) { mFragmentView = pInflater.inflate(R.layout.fragment_layout, pViewGroup, false); mFrameLayout = (FrameLayout) mFragmentView.findViewById(R.id.framelayout); return mFragmentView; } public void onDestroyView() { super.onDestroyView(); } /* ISSUE */ public void doSomethingSpecial() { FragmentManager tFragmentManager = getChildFragmentManager(); } } 

MainActivity我初始化我的片段,如:

 mTestFragment = new TestFragment(); mTestFragment.doSomethingSpecial(); 

然后我通过FragmentPagerAdapter将片段传递给ViewPager

最后,我得到一个例外。 但是,如果我只使用:

 mTestFragment = new TestFragment(); 

然后它工作。

我应该在哪里调用我的片段中的getChildFragmentManager()方法? 我做错了什么?

如果你有一个使用新的Android嵌套片段的好例子,请与我分享链接。 我将非常感谢您的帮助。

简短的回答:我调用,并在我的Fragment的onViewCreated()方法中使用getChildFragmentManager()

例如:

 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addInnerFragment(); // This method does the getChildFragmentManager() stuff. } 

其实我只是在以下的情况下使用。

我试图添加一个地图到ViewPager。 您可能知道,ViewPager中的“页面”是Fragments,所以我无法使用此代码使用来自Activity的地图的示例 。 我正在尝试从Activity获取SupportMapFragment,如下所示:

 SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 

但是,mapView总是空的,所以我的应用程序崩溃。

我find了下面的答案,并在中坚作用。

这可以是一个有用的例子,使用getChildFragmentManager()

希望这可以是有益的。

根据文档 ,这种方法:

返回一个专用的FragmentManager来放置和pipe理这个Fragment中的Fragments。

所以你可以使用它,如果你想添加/replace一个新的片段到你现有的片段,你应该提交你的TestFragment事务,然后添加内部片段。 尝试这样的事情:

  TestFragment mTestFragment = new TestFragment(); //get the activity's fragment manager to add the fragment FragmentTransaction transaction= getFragmentManager().beginTransaction(); transaction.add(R.id.container, mTestFragment).commit(); //add the inner fragment mTestFragment.doSomethingSpecial();