Android:Activity 结果按下返回关闭应用程序
Android: Activity for result pressing back closes the app
在我的应用程序中,我正在打开联系人 activity 以使用新的 Activity 结果 API 选择一个联系人,就像这样
registerForActivityResult(ActivityResultContracts.PickContact()) { it ->
viewModel.setContact(it)
}.launch(null)
联系人 activity 打开,我可以检索联系人,一切正常。但是在联系人 activity 中,按下后退按钮(android 后退按钮或顶部的后退箭头),而不是仅关闭联系人 activity,它会退出我的应用程序.
我在网上找到了针对此问题的修复程序,但仅限于旧的 startActivityForResult
和 onActivityResult
API。有没有一种方法可以在为新的 API 打开 activity 时更改后退按钮的行为?
编辑:注意到模拟器和物理设备上的行为
Adrian 好心地向我提供了他的项目样本。
本答案基于调试示例项目的结果。
由于 Java 和 Kotlin 语言的互操作性,代码中存在一个“不可见”问题。当我们从 Kotlin 代码调用 Java 函数时,我们得到 return 类型的 T!
- 其中 T!
表示“T 或 T?”。
Java 允许 returning null
值,如我们所愿。为了让 Kotlin 知道该值是显式可选的 Java 程序员必须使用 @Nullable
注释。 Kotlin 会把它取而代之 return T?
。
由于 registerForActivityResult
是 Java 函数,我们在 return 中得到 registerForActivityResult(ActivityResultContracts.PickContact())
类型的结果 Uri!
.
同样,Uri!
表示“Uri 还是 Uri?” - “值或空值”。
为了以 Kotlin 风格处理这个值,我们可以使用问号 ?
:
安全地展开它
activityResultLauncher = registerForActivityResult(ActivityResultContracts.PickContact()) {
it?.let { contactUri ->
viewModel.setContact(contactUri)
}
}
在我的应用程序中,我正在打开联系人 activity 以使用新的 Activity 结果 API 选择一个联系人,就像这样
registerForActivityResult(ActivityResultContracts.PickContact()) { it ->
viewModel.setContact(it)
}.launch(null)
联系人 activity 打开,我可以检索联系人,一切正常。但是在联系人 activity 中,按下后退按钮(android 后退按钮或顶部的后退箭头),而不是仅关闭联系人 activity,它会退出我的应用程序.
我在网上找到了针对此问题的修复程序,但仅限于旧的 startActivityForResult
和 onActivityResult
API。有没有一种方法可以在为新的 API 打开 activity 时更改后退按钮的行为?
编辑:注意到模拟器和物理设备上的行为
Adrian 好心地向我提供了他的项目样本。 本答案基于调试示例项目的结果。
由于 Java 和 Kotlin 语言的互操作性,代码中存在一个“不可见”问题。当我们从 Kotlin 代码调用 Java 函数时,我们得到 return 类型的 T!
- 其中 T!
表示“T 或 T?”。
Java 允许 returning null
值,如我们所愿。为了让 Kotlin 知道该值是显式可选的 Java 程序员必须使用 @Nullable
注释。 Kotlin 会把它取而代之 return T?
。
由于 registerForActivityResult
是 Java 函数,我们在 return 中得到 registerForActivityResult(ActivityResultContracts.PickContact())
类型的结果 Uri!
.
同样,Uri!
表示“Uri 还是 Uri?” - “值或空值”。
为了以 Kotlin 风格处理这个值,我们可以使用问号 ?
:
activityResultLauncher = registerForActivityResult(ActivityResultContracts.PickContact()) {
it?.let { contactUri ->
viewModel.setContact(contactUri)
}
}