我使用ActivityResultLauncher
从活动 A 调用活动 B,并在任务完成后设置活动 B 的结果。如果不改变方向,这将完美地工作。问题是当我从活动 B 更改方向然后设置结果时,不会调用活动 A 的registerForActivityResult
。有人可以让我知道,可能是什么问题?
注意:如果我使用startActivityForResult
和onActivityResult
,我不会遇到此问题。我将其更改为ActivityResultLauncher
,因为startActivityForResult
被弃用。
活动 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()
您可以将值保存在onSaveInstanceState()
中,并在onRestoreInstanceState()
中使用 setResult 。
尝试将launcher
的registerForActivityResult
分配移动到onCreateView()
(如果尚未覆盖它)。 把它放在这里,我没有像onResume()
或更高版本那样得到OnCreateView()
的"正在尝试在当前状态启动时注册"RuntimeException
。OnCreateView()
相对于OnCreate()
的优势似乎是,launcher
变量将在主题日/夜变化以及方向变化时重新设置。
另请参阅此处的配置更改和进程死亡部分以获取更多讨论。
我知道官方 dox 说在课堂上设置它是安全的,但主题更改破坏了.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">