出现java.lang.IllegalStateException异常:Fragment声明的目标Fragment不属于当前FragmentManager
这个异常踩过坑的人都懂,核心就是你给弹窗设置的targetFragment和用来显示它的FragmentManager根本不搭——系统检查到弹窗的管理器找不到这个目标Fragment,直接就报错了。
先看你的代码逻辑:你给MyDialogFragment绑定了targetFragment,但用的是targetFragment.getFragmentManager()来获取管理器显示弹窗,这里很容易踩层级的坑:
情况1:你的targetFragment是嵌套子Fragment
如果targetFragment是通过某个父Fragment的getChildFragmentManager()添加的(也就是嵌套Fragment),那getFragmentManager()拿到的是父Fragment的管理器,而不是targetFragment自己所属的子管理器。这时候你需要换成getChildFragmentManager():
Utils.showDialog(targetFragment.getChildFragmentManager(), myDialogFragment, DIALOG_TAG);
这样弹窗和targetFragment同属一个子管理器,系统就能正确关联两者了。
情况2:你的targetFragment直接依附Activity
如果targetFragment是直接用Activity的getSupportFragmentManager()添加的,那直接用Activity的管理器来显示弹窗就对了:
Utils.showDialog(targetFragment.getActivity().getSupportFragmentManager(), myDialogFragment, DIALOG_TAG);
统一用Activity的管理器,就能保证弹窗和targetFragment属于同一个管辖范围,不会出现不匹配的问题。
额外提醒
千万别混用不同层级的FragmentManager!比如用父Fragment的管理器显示子Fragment的弹窗,或者反过来,这种跨层级操作百分百会触发这个异常。最好的方式是让弹窗的FragmentManager和targetFragment的归属完全一致。
内容的提问来源于stack exchange,提问作者sasha199568

