根据Google的文档:
您现在可以在片段中嵌入片段。这对于a非常有用 您希望放置动态和可重复使用的各种情况 UI组件成为一个自身动态的UI组件 可重复使用。例如,如果使用ViewPager创建片段 您可以左右滑动并占用大部分屏幕空间 现在可以将片段插入每个片段页面。 要嵌套片段,只需在要添加片段的片段上调用getChildFragmentManager()。这会返回一个 像你通常那样使用的FragmentManager 用于创建片段事务的顶级活动。例如, 这里有一些代码可以在现有的Fragment中添加一个片段 class:
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();
然后我通过ViewPager
将片段传递给FragmentPagerAdapter
。
最后,我得到一个例外。但如果我只使用:
mTestFragment = new TestFragment();
然后它有效。
我应该在片段中调用getChildFragmentManager()
方法?我做错了什么?
如果您有一个使用新的Android嵌套片段的好例子,请与我分享链接。我非常感谢您的帮助。
答案 0 :(得分:3)
简短回答:我在Fragment的getChildFragmentManager()
方法中致电并使用onViewCreated()
。
例如:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
addInnerFragment(); // This method does the getChildFragmentManager() stuff.
}
答案 1 :(得分:0)
其实我刚用过以下情况。
我试图将地图添加到ViewPager中。您可能知道,ViewPager中的“页面”是片段,因此我无法使用此代码Sample using maps from an Activity。我试图从Activity中获取SupportMapFragment,例如:
SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
但mapView始终为null,因此我的应用程序崩溃了。
我发现了以下answer并且工作正常。
这可以是使用getChildFragmentManager()
的有用示例希望这会有所帮助。
答案 2 :(得分:0)
根据docs,这种方法:
返回私有FragmentManager以放置和管理碎片 在这片段中。
因此,如果要在现有片段中添加/替换新片段,可以使用它,首先应提交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();