【问题标题】:Where to call getChildFragmentManager()?在哪里调用 getChildFragmentManager()?
【发布时间】:2013-09-21 17:29:51
【问题描述】:

问题

根据 Google 的文档:

您现在可以在片段中嵌入片段。这对于一个有用的 您希望在其中放置动态和可重用的各种情况 将 UI 组件转换为本身是动态的 UI 组件 可重复使用的。例如,如果您使用 ViewPager 创建片段 左右滑动并占用大部分屏幕空间,你 现在可以将片段插入每个片段页面。 要嵌套片段,只需在要添加片段的片段上调用 ​​getChildFragmentManager()。这会返回一个 您可以像往常一样使用的 FragmentManager 创建片段事务的顶级活动。例如, 这是一些从现有片段中添加片段的代码 类:

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

【问题讨论】:

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


【解决方案1】:

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

例如:

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

【讨论】:

    【解决方案2】:

    根据docs,这个方法:

    返回一个私有的 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();
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      希望这会有所帮助。

      【讨论】:

      • 您的第一个链接已损坏,第二个链接没有提供任何关于 在哪里 使用getChildFragmentManager() 的信息。 :-(
      • 这是去年的答案:/您可以编辑答案并提供反馈,而不是投反对票
      • 我不确定链接包含什么代码,因此无法真正编辑您的答案。我觉得答案没有用,因此投了反对票 - 但至少我留下了评论! :-)
      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 2015-08-11
      • 2019-11-06
      • 2012-03-13
      • 2016-10-16
      • 1970-01-01
      • 2015-02-05
      • 2013-11-01
      相关资源
      最近更新 更多