繁体   English   中英

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

[英]registerForActivityResult not working when second activity orientation changes

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

注意:如果我使用startActivityForResultonActivityResult ,我不会遇到这个问题。 我将其更改为ActivityResultLauncher ,因为startActivityForResult 已弃用

活动示例代码:

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

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

尝试将launcherregisterForActivityResult分配移动到onCreateView() (如果你还没有覆盖它)。 把它放在这里,我没有得到“正在尝试注册,而当前 state 已启动”在OnCreateView()中的RuntimeExceptiononResume()或更高版本一样。 OnCreateView()优于OnCreate()的优势似乎是launcher变量将在主题日/夜变化以及方向变化时重新设置。

另请参阅此处配置更改和进程死亡部分以获取更多讨论。

我知道官方 dox说在 class 中的任何其他内容之前设置它是安全的,但是主题更改破坏了.launch() ,并且这个位置似乎对我有用。

每次方向更改时,它都会调用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 然后在您的清单中,您可以添加configChanges

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM