android - 当嵌套 fragment 使用替换而不是添加时不调用 OnActivityResult 不保留 Activity

标签 android android-fragments

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

MainActivity -> ContainerFragment -> MainFragment

ContainerFragment 使用replace 来提交 MainFragment。

我打开不保持 Activity `

当 MainFragment 调用 startActivityForResult 并从 Activity 返回时,不会调用 onActivityResult

This doesn't happen when

  • It is a single Fragment. (not nested)
  • Don't Keep Activity is OFF
  • When ContainerFragment uses add to commit the MainFragment.

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

https://github.com/elye/issue_android_onactivityresult_not_called

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

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

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

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

最佳答案

基于 https://issuetracker.google.com/issues/36926548 的回答, 它解决了这个问题。

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

在这种情况下,在 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()
}

关于android - 当嵌套 fragment 使用替换而不是添加时不调用 OnActivityResult 不保留 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770376/

相关文章:

android - 如何在我的安卓手机上接收 GPRS 数据包?

java - Activity 未分配给 Android.app.Activity Manifest XML

android - 那么 Android 3.0 中 Fragments 的确切优势是什么?

android - 每次查看 FragmentStatePagerAdapter 中的 fragment 时执行代码

java - RecyclerView 从另一个类中删除一个项目

android - 从 Activity 获取 Fragment 的抽屉导航

android - Alarmmanager - 每分钟发生火灾警报

javascript生成方波声音

java - Android java tts.isLanguageAvailable() 即使在语言可用后也不起作用

android - 如何使用 FragmentPagerAdapter 在 fragment 之间滑动