在哪里调用getChildFragmentManager()?

Ale*_*tov 10 android android-fragments android-viewpager fragmentmanager android-nested-fragment

问题

根据谷歌的文档:

您现在可以将片段嵌入片段中.这对于您希望将动态和可重用UI组件放入自身动态且可重用的UI组件的各种情况都很有用.例如,如果使用ViewPager创建向左和向右滑动并占用大部分屏幕空间的片段,则现在可以将片段插入到每个片段页面中.要嵌套片段,只需在要添加片段的片段上调用getChildFragmentManager().这将返回一个FragmentManager,您可以像通常从顶级活动那样使用它来创建片段事务.例如,这里有一些代码可以在现有的Fragment类中添加一个片段:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
Run Code Online (Sandbox Code Playgroud)

所以我(例如)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();
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity我初始化我的片段像:

mTestFragment = new TestFragment();
mTestFragment.doSomethingSpecial();
Run Code Online (Sandbox Code Playgroud)

然后我将片段传递给ViewPagervia FragmentPagerAdapter.

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

mTestFragment = new TestFragment();
Run Code Online (Sandbox Code Playgroud)

然后它工作.

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

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

Ama*_*rza 0

其实我只是在下面的案例中使用过。

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

SupportMapFragment mapView = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
Run Code Online (Sandbox Code Playgroud)

但mapView始终为空,所以我的应用程序崩溃了。

我找到了以下答案并立即生效。

这是一个使用 getChildFragmentManager() 的有用示例

希望这会有所帮助。