我在下面用
创建了一个简单的应用程序MainActivity-> ContainerFragment-> MainFragment
ContainerFragment使用replace
提交MainFragment。
我打开并没有保持活动状态
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
很显然,以前有报道称嵌套的Fragment过去无法获得onActivityResult
,如https://stackoverflow.com/a/36239436/3286489中所述,但已在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
答案 0 :(得分:0)
根据https://issuetracker.google.com/issues/36926548的回答,它解决了问题。
原因是在创建片段之前,我们应该先检查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()
}
答案 1 :(得分:0)
我有一个问题,当我尝试从一个片段中调用时,尚未调用Fragment.onActivityResult():
getActivity().startActivityForResult()
代替
this.startActivityForResult()