声明的Fragment目标Fragment不属于此FragmentManager

24

我创建了一个名为A的活动,在其中有一个包含碎片X的布局。在碎片X中,EditText控件具有点击事件,该事件会打开碎片Y。碎片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: Fragment y{46d3d31 #3 id=0x7f090069} declared target fragment x{e2c16 #0 id=0x7f090104 android:switcher:2131296516:0} that does not belong to this FragmentManager!


你的问题帮了我大忙,因为我也遇到了同样的问题,并通过使用supportFragmentManager而不是childFragmentManager解决了它。 - Mosa
3个回答

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

4
如何确保当前片段和目标片段具有相同的片段管理器? - Salman Saleem
1
我通过调试并设置断点进行了检查,我的FragmentManager的id是相同的,但仍然崩溃了...所以我很疑惑... - karan
虽然这可能是不好的做法,但我将我的“getChildFragmentManager()”更改为“getFragmentManager”,虽然它解决了问题,但我可以看到在某些情况下会产生其他问题。 - C. Skjerdal
@C. Skjerdal,有没有使用其他方法的解决方案?getFragmentManager已经被弃用。 - luke cross

4
在我的解决方案中,替换
getChildFragmentManager()

使用
Activity.getSupportFragmentManager() or Fragment.getFragmentManager()

这对我有帮助。谢谢Ben P先生。


2

对于新用户而言,如果他们不想使用已弃用的方法,但仍需要使用"getFragmentManager",那么方法"getParentFragmentManager"同样适用。


以上方法对我也没有用。我正在使用最新的androidx。 - sejn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接