【问题标题】:getParentFragment returning nullgetParentFragment 返回 null
【发布时间】:2013-02-11 00:58:57
【问题描述】:

我有一个Fragment,它有一个FrameLayout。第一个片段 (A) 在其 Framelayout 中加载另一个片段 (B)。当我从内部片段 (B) 调用getParentFragment 时,我得到null。这种方法应该如何正确使用?

【问题讨论】:

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


    【解决方案1】:

    getParentFragment() 是在 API 级别 17 (Android 4.2) 中引入的。 Android 4.2 引入了嵌套片段(包含其他片段的片段)的思想。如果片段的父级是 Activity,则调用它会导致 null。

    看看this

    如果您使用支持库,那么您可以使用 getParent(),可能在进行片段事务时需要使用 getChildFragmentManager()。 见this

    【讨论】:

    • 谢谢!我改用 setTargetFragment 。我知道这不是为了这个目的,但确实可以。
    • 它是在 4.2 中引入的,但可以通过支持库在早期版本中使用
    • 为什么 findFragmentByTag 在子片段(即嵌套)中不起作用'
    【解决方案2】:

    在我的例子中,虽然我的 fragmentA 嵌套在 fragmentB 中,但是在 FragmentA 中调用 getParentFragment 后我仍然得到 null。最后我发现我应该在 FragmentB 中使用 getChildFragmentManager 而不是 getFragmentManager。

    检查这个What is difference between getSupportFragmentManager() and getChildFragmentManager()?

    【讨论】:

    • 另请注意,nested Fragments 有一个限制,即当该布局包含 标记时,您不能将布局扩展为 Fragment。仅当通过 getChildFragmentManager() 动态添加到 Fragment 时,才支持嵌套的 Fragments
    【解决方案3】:

    帮助的一件事是,在创建适配器时使用getChildFragmentManager()

    如果您不使用适配器,则在进行事务时使用getChildFragmentManager()

    不推荐setTargetFragment(),因为它会在片段的moveState() 上给出错误(因为片段应该绑定到FragmentManager)

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,并通过在您的父片段中使用getChildFragmentManager() 托管第二个片段来解决问题,那么您将不会获得空值...

      父片段

        SignUpFragment signUpFragment = new SignUpFragment();
          getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contentPanel, signUpFragment)
                  .addToBackStack(null).commit();
      

      子片段:我使用的是一个对话框

       HospitalCardDialog hospitalCardDialog = new HospitalCardDialog();
          hospitalCardDialog.show(getChildFragmentManager(), "");
      

      【讨论】:

        猜你喜欢
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        相关资源
        最近更新 更多