12

问题

根据谷歌的文档:

您现在可以在片段中嵌入片段。这对于您希望将动态且可重用的 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();

然后我将片段传递给ViewPagervia FragmentPagerAdapter

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

mTestFragment = new TestFragment();

然后它工作。

问题

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

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

4

3 回答 3

3

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

例如:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    addInnerFragment(); // This method does the getChildFragmentManager() stuff.
}
于 2016-06-09T13:36:42.037 回答
0

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

我试图将地图添加到 ViewPager 中。您可能知道, ViewPager 中的“页面”是片段,因此我无法使用Activity 中的地图使用此代码示例。我试图从 Activity 中获取 SupportMapFragment,例如:

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

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

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

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

希望这会有所帮助。

于 2015-12-11T01:14:38.643 回答
0

根据文档,此方法:

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

因此,如果您想向现有片段添加/替换新片段,则可以使用它,您应该首先提交您的 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();
于 2016-06-09T13:58:14.250 回答