onActivityResult() 在新的嵌套片段 API 中未调用

2023-11-26

我一直在用新的嵌套片段Android 包含在支持库中的 API。

我面对嵌套片段的问题是,如果一个嵌套片段(即,通过FragmentManager由返回getChildFragmentManager()) calls startActivityForResult(),嵌套片段的onActivityResult()方法未被调用。然而,父片段的onActivityResult()和活动的onActivityResult()一定会接到电话。

我不知道我是否遗漏了有关嵌套片段的一些内容,但我没想到所描述的行为。下面是重现此问题的代码。如果有人能指出我正确的方向并向我解释我做错了什么,我将非常感激:

package com.example.nestedfragmentactivityresult;

import android.media.RingtoneManager;
import android.os.Bundle;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends FragmentActivity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, new ContainerFragment())
            .commit();
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        // This is called
        Toast.makeText(getApplication(),
            "Consumed by activity",
            Toast.LENGTH_SHORT).show();
    }

    public static class ContainerFragment extends Fragment
    {
        public final View onCreateView(LayoutInflater inflater,
                                       ViewGroup container,
                                       Bundle savedInstanceState)
        {
            View result = inflater.inflate(R.layout.test_nested_fragment_container,
                container,
                false);

            return result;
        }

        public void onActivityCreated(Bundle savedInstanceState)
        {
            super.onActivityCreated(savedInstanceState);
            getChildFragmentManager().beginTransaction()
                .add(R.id.content, new NestedFragment())
                .commit();
        }

        public void onActivityResult(int requestCode,
                                     int resultCode,
                                     Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            // This is called
            Toast.makeText(getActivity(),
                "Consumed by parent fragment",
                Toast.LENGTH_SHORT).show();
        }
    }

    public static class NestedFragment extends Fragment
    {
        public final View onCreateView(LayoutInflater inflater,
                                       ViewGroup container,
                                       Bundle savedInstanceState)
        {
            Button button = new Button(getActivity());
            button.setText("Click me!");
            button.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                    startActivityForResult(intent, 0);
                }
            });

            return button;
        }

        public void onActivityResult(int requestCode,
                                     int resultCode,
                                     Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            // This is NOT called
            Toast.makeText(getActivity(),
                "Consumed by nested fragment",
                Toast.LENGTH_SHORT).show();
        }
    }
}

test_nested_fragment_container.xml 是:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</FrameLayout>

我用以下代码解决了这个问题(使用了支持库):

在容器片段中以这种方式重写 onActivityResult :

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

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

现在,嵌套片段将收到对 onActivityResult 方法的调用。

另外,如noted 埃里克·布林斯沃尔德在类似的问题中,嵌套片段应该使用其父片段而不是简单的 startActivityForResult() 调用来启动活动。因此,在嵌套片段中启动活动:

getParentFragment().startActivityForResult(intent, requestCode);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onActivityResult() 在新的嵌套片段 API 中未调用 的相关文章

随机推荐

  • 捕获 java 进程终止的时间

    当有人通过任务管理器或任务杀控制台命令杀死我的应用程序 java 但这并不重要 时 我如何捕获 我知道我无法在我的应用程序中捕捉到这一点 但也许我可以通过操作系统 当然是 Windows 的一些钩子来做到这一点 也许是 Easyhook 库
  • 如何使用 boost::filesystem 计算目录中的文件数量?

    我得到了 boost filesystem path 有没有一种快速的方法来获取路径指向的目录中的文件数量 这是标准 C 中的一句话 include
  • MSDeploy 所有配置 [.config 文件] 在一个包中

    目前我们有 4 个不同的环境 Lab Test Stage LIVE 并且我们已经使用 Nant CC Net 实现了自动部署 我正在调查和研究使用新的 MSDeploy 工具可以更有效地完成哪些工作 我想要实现的是创建一个带有配置文件夹的
  • 修改 Google 地图类型的最大缩放级别

    我需要设置maxZoom的水平google maps MapTypeId HYBRID到 21 实际上 他设置为 14 用 firebug 控制台检查 设置属性google maps对象 maxZoom 在这种情况下不起作用 我已经尝试修改
  • 如何在 ManagedBean 中注入 CDI Bean?

    我想使用注释 Inject 或 Produce 在 ManagedBean 中注入 CDI Bean 我使用的 CDI Bean 是 Named Startup ApplicationScoped public class BaseBean
  • 如何在 Flutter 中创建圆形 ListView

    如何在 Flutter 中创建循环 ListView 我想要一些能让我围绕原点旋转的小部件列表的东西 Something similar to this 任何帮助 将不胜感激 循环列表视图演示 这可能对您有帮助 主dart import p
  • WinDbg 地址摘要

    随着用户负载的增加 我们在 IIS 中托管的 WCF 服务崩溃 w3wp exe 1 6 GB 我们通过 Debug Diag 获得了转储并在 WinDbg 中运行了此命令 这是输出 0 000 gt address summary Fai
  • Symfony 2.8 -> 3.4 升级 IsGranted('IS_AUTHENTICATED_ANONYMOUSLY') 抛出错误

    我正在将 Symfony 从 2 8 升级到 3 4 并且我有一个身份验证侦听器 监听器的构造函数 public function construct EntityManager entityManager SessionInterface
  • 如何更改工具栏上的更改文本和箭头颜色?

    我目前正在使用新的材料设计指南构建一个应用程序 我使用的是工具栏而不是操作栏 我希望文本 溢出图标和箭头 汉堡图标 当您拉出导航绘图时翻转的东西 为白色而不是黑色 但我的主题的其余部分需要是 AppCompat light 主题 如果有人可
  • 让 ApiController 与区域一起工作?

    目前 我的 ASP NET MVC 5 项目中有 2 个区域 一种叫做支持者 一个称为Chatter 在这两个区域中的每一个区域中 都有一个ApiController named CommunicationController 这会带来一个
  • 读取时如何忽略 CSV 中的空行

    尝试使用以下命令读取具有空行 通常在末尾 的 CSV 文件CsvHelper GetRecords
  • 来自 requests Python 库的 HTTP 请求中缺少 Host 标头

    哪儿是HTTP 1 1 强制 Host 标头字段在HTTP请求消息中生成requestsPython 库 import requests response requests get https www google com print re
  • Gradle build.gradle 到 Maven pom.xml

    我有一个 Gradle 项目 我需要将其所有依赖项转移并与另一个 Maven 项目一起使用 换句话说 我如何从 build gradle 生成 或者可以生成 pom xml 从 Gradle 7 开始 当使用Gradle 的 Maven P
  • 使用 z3 获得“良好”的 unsat 核心(逻辑 QF_BV)

    我正在使用 Z3 SMT 求解器来解决我使用 SMTLIB 2 语言在逻辑 QF BV 中表达的问题 该模型是不可满足的 我正在尝试让求解器产生一个不满足的核心 我的模型由几个 强制 约束组成 我使用assert声明 我希望考虑用于 uns
  • Java 15 的密封类功能中的最终类和非密封类有什么区别?

    我有以下密封接口 Java 15 public sealed interface Animal permits Cat Duck String makeSound 该接口由2个类实现 public final class Cat imple
  • iPad 上的 jQuery 鼠标悬停

    我有一个 jQuery 代码 可以在桌面浏览器上完美运行 span checkbox err mouseout function span checkbox err fadeOut slow 但同样的情况不会在 iPad 上触发 因此 ch
  • 您首选的 php 部署策略是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在开始一个 PHP 的
  • @property(非原子,retain)语句在应用程序中的用途是什么?

    我是一名初学者 iphone 开发人员 我想知道 property nonatomic retain 语句的用途是什么 例如 任何人都可以给我任何答案吗 财产告诉 Objective C 为该成员变量生成 getter 和 setter 合
  • 无限循环滑块概念

    我想知道使用 JavaScript jQuery 为网站构建无限图像循环滑块的最佳概念是什么 良好的可读代码 害虫实践代码 可重用性 我不知道如何编码幻灯片放映 但什么蓝图符合上述要求 我的问题的主要焦点是如何排列图片以获得无限循环滑块的印
  • onActivityResult() 在新的嵌套片段 API 中未调用

    我一直在用新的嵌套片段Android 包含在支持库中的 API 我面对嵌套片段的问题是 如果一个嵌套片段 即 通过FragmentManager由返回getChildFragmentManager calls startActivityFo