我在下面创建了一个简单的应用程序
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/