【问题标题】:OnActivityResult not called when nested fragment is using replace instead of add with Don't Keep Activity嵌套片段使用替换而不是添加不保留活动时未调用 OnActivityResult
【发布时间】:2019-09-10 05:28:45
【问题描述】:

我在下面创建了一个简单的应用程序

MainActivity -> ContainerFragment -> MainFragment

ContainerFragment 使用replace 提交 MainFragment。

我打开不保持Activity`

当 MainFragment 调用 startActivityForResult 并从活动返回时,onActivityResult 不会被调用。

这种情况不会发生

  • 它是一个片段。 (未嵌套)
  • Don't Keep Activity 已关闭
  • 当 ContainerFragment 使用 add 提交 MainFragment 时。

要复制问题,请下载以下 github 中的代码并运行它。 (记得开启Don't Keep Activity)。点击Start Activity..,然后点击End Activity,期待一个Toast(没有Toast,说明片段中的onActivityResult没有被调用)

https://github.com/elye/issue_android_onactivityresult_not_called

显然之前在https://stackoverflow.com/a/36239436/3286489 中发布过一个报告的嵌套Fragment 无法获取onActivityResult,但声明已在Android 支持库23.2.1 中解决。但就我而言,我尝试了 Android Support Library 28 (Android Pie)。所以我相信这仍然是一个有效的问题。

在这里分享一下,以防我错了,那里有一些解释。

以防万一,https://inthecheesefactory.com/blog/how-to-fix-nested-fragment-onactivityresult-issue/en 推荐了一种解决方法。

报告的另一种解决方法 https://stackoverflow.com/a/20543245/3286489

【问题讨论】:

  • 您希望调用片段的onActivityResult 还是调用活动的onActivityResult
  • Fragment 中的 onActivityResult 尽管预期没有被调用。它在 Activity 的 onActivityResult 中调用,但没有匹配的 requestCode
  • 如果你想拥有正确的resultCode 在片段中使用activity.startActivityForResult
  • 不,我们希望在触发(嵌套)片段中调用onActivityResult(使用replace 操作提交)。它在Don't Keep Activity 关闭时有效,但在打开时无效。
  • 发现即使在AndroidX中它仍然是一个错误issuetracker.google.com/issues/130327691

标签: android android-fragments


【解决方案1】:

当我尝试从片段中调用时,我遇到了这个问题,即 Fragment.onActivityResult() 没有被调用:

getActivity().startActivityForResult()

而不是

this.startActivityForResult()

【讨论】:

    【解决方案2】:

    根据https://issuetracker.google.com/issues/36926548的回答,问题解决了。

    原因是在创建Fragment之前,我们应该先检查savedStateInstace是否为空。

    本例在https://github.com/elye/issue_android_onactivityresult_not_called的项目中,

    应该是ContainerFragment

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (savedInstanceState == null)
            childFragmentManager.beginTransaction().replace(R.id.fragment_container, MainFragment()).commit()
    }
    

    MainActivity,应该是

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (savedInstanceState == null)
            supportFragmentManager.beginTransaction().add(R.id.container, ContainerFragment()).commit()
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2012-11-14
    • 2016-05-29
    • 2014-09-18
    • 2013-05-02
    相关资源
    最近更新 更多