在我的嵌套片段中,onActivityResult从未被调用

5

我有许多嵌套的片段。

  • 活动A
    • MainFragment(在FrameLayout中)
      • 片段A(在MainFragment的FrameLayout中)
      • 片段B(在MainFragment的FrameLayout中)
        • 片段C(在Fragment B的ViewPager中)
        • 片段D(在Fragment B的ViewPager中)<--- 这是我想要捕获onActivityResult的位置

这是我启动结果活动的方式:

startActivityForResult(Intent.createChooser(intent, "Title"), FILE_PICK);

我在其他地方没有重写onActivityResult。我尝试在Activity A中调用它,它被调用了,但即使我调用了super,它也从未到达Fragment D。还尝试在MainFragment中调用onActivityResult,但它在那里也不会被调用。


这个链接可能会对你有所帮助:http://stackoverflow.com/a/31012323/4252352 你可能需要调用 getChildFragmentManager(),因为它是嵌套的片段。 - Mark
不确定这个链接是否仍然有效,或者它是否已经修复。然而,我猜可能是这种情况。 - Illia K.
2个回答

12

该事件将在Activity中接收。如果要在D片段中进行,请传播它。

在您的父 Activity 中重写 onActivityResult 并开始调用您的片段的 onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

在您的父片段中,您需要做相同的事情,但请记住使用getChildFragmentManager来获取该片段的片段管理器。

    List <Fragment> fragments = getChildFragmentManager().getFragments();

2
谢谢。我接受了这个答案,因为它是解决这个问题的“通用”解决方案。你只需在所有嵌套的片段中调用onActivityResult即可。然而,我想指出@Jagu(下面)也发布了一个非常好的解决方案,可以为单个片段解决此问题(正是我所需要的)。 - Guy

4

如果要在FragmentD中调用onActivityResult,需要在父Activity中重写onActivityResult方法:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Fragment fragmentD = getSupportFragmentManager().findFragmentByTag("FRAGMENT_D_TAG");
        if (fragmentD != null) {
            fragmentD.onActivityResult(requestCode, resultCode, data);
        }
    }

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