当嵌套片段使用替换而不是使用“不要保留活动”进行添加时,不会调用OnActivityResult

时间:2019-04-20 04:54:01

标签: android android-fragments

我在下面用

创建了一个简单的应用程序

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

2 个答案:

答案 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()