在哪里调用getChildFragmentManager()方法?

12

问题

根据 Google 文档:

现在,您可以在片段内嵌入片段。这对于许多情况非常有用,例如,当您想将动态和可重复使用的 UI 组件放置到本身是动态且可重复使用的 UI 组件中时。例如,如果您使用 ViewPager 创建滑动左右并占据大部分屏幕空间的片段,现在可以将片段插入每个片段页面。 要嵌套一个片段,只需在要添加片段的片段上调用 getChildFragmentManager() 方法。 这将返回一个 FragmentManager,您可以像从顶级活动中创建片段事务一样使用它。 例如,下面是一些代码,它会从现有 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嵌套碎片的好例子,请与我分享链接。我非常感谢您的帮助。


3个回答

4

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

例如:

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

0
根据文档,该方法:

返回一个私有的FragmentManager,用于在此Fragment中放置和管理Fragments。

因此,如果您想要向现有的Fragment添加/替换新的Fragment,则应首先提交TestFragment事务,然后将内部Fragment添加到其中。尝试像这样做:
    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();

0

实际上,我只是在以下情况下使用。

我试图将地图添加到ViewPager中。正如您所知,ViewPager中的“页面”是片段,因此我无法使用此代码从Activity使用地图的示例。我试图从Activity获取SupportMapFragment并执行以下操作:

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

但是mapView始终为空,因此我的应用程序崩溃了。

我找到了以下答案并立即起作用。

这可以是使用getChildFragmentManager()的有用示例

希望这对您有所帮助。


你的第一个链接已经失效了,而第二个链接也没有提供任何关于在哪里使用getChildFragmentManager()的见解。 :-( - ban-geoengineering
那是去年的答案:/ 你可以编辑答案并提供反馈,而不是进行负面评价。 - Amaury Esparza
我不确定链接包含了什么代码,所以无法真正编辑你的回答。我觉得这个答案没有用,因此我给了一个负评 - 但至少我留下了评论! :-) - ban-geoengineering

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接