【问题标题】:Fragment declared target fragment that does not belong to this FragmentManager不属于此 FragmentManager 的 Fragment 声明的目标 Fragment
【发布时间】:2017-10-31 23:06:54
【问题描述】:

我创建了一个活动 A,其中包含一个片段 X。在片段 X 中,EditText 项目具有打开片段 Y 的单击事件。此片段显示名称列表。我在列表中按下一个名称,片段 Y 关闭并将所选名称发送到片段 X EditText。这是我写的代码:

YFragment y = new YFragment();
y.setTargetFragment(x.class, code);
getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.frame, y)
    .addToBackStack(null)
    .commit();

在片段 Y 中,我有发送数据的代码,但问题出在上面的这段代码中。如果我注释掉 setTargetFragment 行,代码将起作用,但没有用处,因为不会发送数据。如果我运行该应用程序,则会出现此错误:

java.lang.IllegalStateException: 片段 y{46d3d31 #3 id=0x7f090069} 声明的目标片段 x{e2c16 #0 id=0x7f090104 不属于这个的android:switcher:2131296516:0} 片段管理器!

【问题讨论】:

  • 你的问题救了我,因为 h 有同样的问题并解决了当使用 supportFragmentManager 而不是 childFragmentManager 时

标签: java android android-fragments


【解决方案1】:

要使用setTargetFragment(),新的Fragment 和目标Fragment 必须托管在同一个FragmentManager 中。不会发生这种情况的最常见情况是,如果您同时使用 Activity.getSupportFragmentManager()Fragment.getFragmentManager()Fragment.getChildFragmentManager()

【讨论】:

  • 如何确保我当前的片段和目标片段具有相同的片段管理器?
  • 我通过调试和保持断点进行了检查。我的两个 FragmentManager 的 id 都相同,但它仍然崩溃...所以我想知道...
  • 虽然可能是不好的做法,但我将“getChildFragmentManager()”更改为“getFragmentManager”,虽然它解决了问题,但我可以看到这会在某些情况下造成其他问题
  • @C. Skjerdal 有什么办法可以使用其他方法吗? getFragmentManager 已弃用
【解决方案2】:

在我的解决方案中,替换

getChildFragmentManager()

Activity.getSupportFragmentManager() or Fragment.getFragmentManager()

这对我有用。感谢本P先生

【讨论】:

    【解决方案3】:

    对于“getFragmentManager”仅适用于它但不想使用已弃用方法的新用户,“getParentFragmentManager”方法也适用。

    【讨论】:

    • 以上对我也不起作用。我正在使用最新的 androidx
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2020-02-06
    • 2021-04-09
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多