Android 嵌套片段 -- 如何只为一个子片段调用 onActivityResult()

Android nested fragments -- how to call onActivityResult() for just one child fragment

我有一个父片段,其中有三个嵌套的子片段。 我想在我的子片段上调用 ​​onActivityResult()。

我知道嵌套片段不会调用 onActivityResult(),因此我们需要从父片段中显式调用它。

所以在我的父片段中我覆盖了 onActivityResult:-

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
                fragment.onActivityResult(requestCode, resultCode, intent);
        }
    }
} 

但问题是,即使我只处理一个子片段,也会为所有三个嵌套片段调用 onActivityResult()。

从我正在启动系统的每个子片段 activity(联系人选择器)以及我无法设置和意图额外的地方,它 returns null(系统活动不会发回额外的内容他们被称为)。那么有没有一种方法可以识别特定的子片段,并且只是 运行 嵌套片段的 onActivityResult() ,我为此点击了按钮。以下是我的嵌套片段中的代码。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    contactPickerButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent contactPickerIntent = new Intent(ACTION_GET_CONTENT);
            contactPickerIntent.setType(CONTENT_ITEM_TYPE);
            getParentFragment().startActivityForResult(contactPickerIntent, PICK_CONTACT_REQUEST_ID);
        }
    });
}

您可以为 startActivityForResult 中的每个片段提供不同的 requestCode 并检查相同的 requestCode 并处理它。

碎片无论如何都是活跃的。 在这种情况下,您可以将嵌套的片段 ID 存储在您的 onActivityCreated() 方法中:

FRAGMENT_ID=((RelativeLayout)view.getParent()).getId(); // cast it to your parent view

然后你可以在嵌套的 fragment.Something 的 onActivityResult 中检查相同的内容

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if ((requestCode == REQUEST_ID) && 
            (resultCode == RESULT_OK) &&
            (getId() == FRAGMENT_ID)) {
            // your logic here
        }
    }

可以有更好的方法,但这肯定会奏效。希望这有帮助。