【问题标题】:Android nested fragments -- how to call onActivityResult() for just one child fragmentAndroid 嵌套片段——如何只为一个子片段调用 onActivityResult()
【发布时间】:2015-07-14 01:50:31
【问题描述】:

我有一个父片段,其中有三个嵌套的子片段。 我想在我的子片段上调用 ​​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() 也会为所有三个嵌套片段调用。

从我正在启动系统活动(联系人选择器)的每个子片段中,在我无法设置和意图额外的地方,它返回 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);
        }
    });
}

【问题讨论】:

    标签: android android-nested-fragment


    【解决方案1】:

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

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

    然后您可以在嵌套片段的 onActivityResult 中检查相同的内容。类似这样的东西

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

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

    【讨论】:

      【解决方案2】:

      您可以为startActivityForResult 中的每个片段指定不同的requestCode,并检查相同的requestCode 并进行处理。

      【讨论】:

      • 感谢您的回复,但实际上我对所有三个嵌套片段使用相同的代码,如何根据特定片段分配不同的请求代码?
      • 我没明白你的意思。如果你有 3 个 Fragment,那么你可以分别为每个 Fragment 设置 requestCode。如果您使用相同的代码,则只需在 startActivityForResult 方法中更改每个片段的 requestCode。
      • 实际上,我只有一个片段(包含一个按钮),(单个 xml 和单个 java 片段类),我用不同的 id 使用了 3 次,所以我无法设置按钮单击中的三个不同的唯一 requestCode。我尝试设置 requestcode= fragment id 但其中有大小限制。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多