在哪里调用getChildFragmentManager()?

时间:2013-09-21 17:29:52

标签: android android-fragments android-viewpager fragmentmanager android-nested-fragment

问题

根据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嵌套片段的好例子,请与我分享链接。我非常感谢您的帮助。

3 个答案:

答案 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();