当第二个活动方向改变时 registerForActivityResult 不起作用

Posted

技术标签:

【中文标题】当第二个活动方向改变时 registerForActivityResult 不起作用【英文标题】:registerForActivityResult not working when second activity orientation changes 【发布时间】:2021-07-21 11:42:45 【问题描述】:

我正在使用ActivityResultLauncher 从活动 A 调用活动 B,并在任务完成后设置活动 B 的结果。如果方向没有改变,这将非常有效。问题是当我从活动 B 更改方向然后设置结果时,不会调用活动 A 的 registerForActivityResult。谁能告诉我,可能是什么问题?

注意:如果我使用startActivityForResultonActivityResult,我不会遇到这个问题。我把它改成了ActivityResultLauncher,因为startActivityForResult变成了deprecated。

活动A示例代码:

private lateinit var launcher: ActivityResultLauncher<Intent>

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(layout)
    setLauncherResult()


private fun setLauncherResult() 
    launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) 
            //Do operations here
        


 //On button click starting activity B using launcher
 val intent = Intent(activityA, activityB)
 launcher.launch(intent)


活动B示例代码:

//setting result
val intent = Intent()
//set intent extras
setResult(Activity.RESULT_OK, intent)
finish()

【问题讨论】:

您能否链接startActivityForResult 已弃用的信息? @snachmsm developer.android.com/jetpack/androidx/releases/… 【参考方案1】:

您可以将值保存在onSaveInstanceState() 中,然后在onRestoreInstanceState() 中使用setResult。

【讨论】:

值已经保存在 onSaveInstanceState() 中。如何在 onRestoreInstanceState() 中执行 setResult? setResult 在活动 B 中的键盘完成操作上完成。【参考方案2】:

每次方向更改时,它都会调用 onCreate 并重置您的视图和其他变量,如 launcher 会重新分配。所以你可以按照官方文档中的例子:https://developer.android.com/training/basics/intents/result#launch

然后将您的launcher 分配从onCreate 中提取出来,如下所示(这对我有用):

class MainActivity : AppCompatActivity() 

    private lateinit var binding: ActivityMainBinding


    private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) 
            //do your stuff here
            binding.tv.text = result.data?.getStringExtra("text")
        
    


    companion object 
        var number : Int = 0
    

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.tv.setOnClickListener 
            val intent = Intent(this, ActivityB::class.java)
            startForResult.launch(intent)
        
    

如果您不希望在方向更改时再次调用 onCreate。然后在您的 Manifest 中添加 configChanges:

<activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize">

【讨论】:

以上是关于当第二个活动方向改变时 registerForActivityResult 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

方向更改后片段中的 getActivity() 为空

方向改变后的第二次活动

打开第二个窗口后隐藏主窗口?另外,当第二个窗口被用户关闭时,主窗口如何重新出现?

当第一个脚本运行第二个脚本方法时,第二个脚本无法识别第一个脚本的变量

从另一个活动调用时为空侦听器

当第二个被触摸时,android的状态栏中出现多个推送通知其他人消失