当第二个活动方向改变时 registerForActivityResult 不起作用
Posted
技术标签:
【中文标题】当第二个活动方向改变时 registerForActivityResult 不起作用【英文标题】:registerForActivityResult not working when second activity orientation changes 【发布时间】:2021-07-21 11:42:45 【问题描述】:我正在使用ActivityResultLauncher
从活动 A 调用活动 B,并在任务完成后设置活动 B 的结果。如果方向没有改变,这将非常有效。问题是当我从活动 B 更改方向然后设置结果时,不会调用活动 A 的 registerForActivityResult
。谁能告诉我,可能是什么问题?
注意:如果我使用startActivityForResult
和onActivityResult
,我不会遇到这个问题。我把它改成了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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
打开第二个窗口后隐藏主窗口?另外,当第二个窗口被用户关闭时,主窗口如何重新出现?