在使用ActivityResultContracts.StartActivityForResult()启动Activity时,如果不重写onActivityResult()方法,则返回结果仅会被调用一次。解决此问题的方法是通过注册一个ActivityResultCallback回调来处理返回结果并将其存储在ViewModel中。当ViewModel需要使用结果时,可以通过观察LiveData的变化将其提供给UI层。
以下是一段示例代码,演示了如何使用ViewModel和LiveData来处理ActivityResultContracts.StartActivityForResult()回调的结果:
在ViewModel中定义一个LiveData:
class MyViewModel : ViewModel() {
private val _resultLiveData = MutableLiveData()
val resultLiveData: LiveData = _resultLiveData
fun setResult(result: String) {
_resultLiveData.value = result
}
}
在UI层中,注册ActivityResultCallback回调并将结果存储在ViewModel中:
class MyActivity : AppCompatActivity() {
private val myViewModel: MyViewModel by viewModels()
private val someActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
// Extract result data and save it in ViewModel
data?.getStringExtra("result")?.let { myViewModel.setResult(it) }
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Start activity with ActivityResultLauncher
someActivityResultLauncher.launch(Intent(this, SomeActivity::class.java))
// Observe LiveData for result changes
myViewModel.resultLiveData.observe(this, Observer {
// Handle result changes in UI
showToast(it)
})
}
}
在上面的代码中,当返回结果时,它将被提取并存储在ViewModel中的LiveData对象中。UI层需要观察LiveData以获取结果。在LiveData发生变化时,可以在UI层中处理结果。
上一篇:ActivityResultContracts.PickMultipleVisualMedia仅按创建日期顺序返回URI。
下一篇:ActivityResultContracts.TakePicture()在尝试更新URI时遇到FileNotFoundException问题。