Android 应用在使用 registerForActivityResult 启动另一个 activity 时退出
Android app exits when launch another activity using registerForActivityResult
我有 2 个 类 MainActivity 和 EditActivity。我尝试在 MainActivity 中使用 registerForActivityResult() 启动 EditActivity,但应用程序立即退出; startActivity() 工作正常,但 registerForActivityResult() 符合我的目的,即将结果返回到 MainActivity。启动EditActivity的函数如下。
MainActivity.kt
fun launchEditView(position: Int) {
val getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if(it.resultCode == Activity.RESULT_OK){
val value = it.data?.getStringExtra("alternative")
listOfTasks.set(position, value.toString())
adapter.notifyDataSetChanged()
saveItems()
}
}
// first parameter is the context, second is the class of the activity to launch
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("taskName", listOfTasks.get(position))
getResult.launch(intent)
}
更新:错误是
java.lang.IllegalStateException: LifecycleOwner com.example.simpletodo.MainActivity@3a90598 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:682)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:691)
at com.example.simpletodo.MainActivity.launchEditView(MainActivity.kt:86)
您看到的 logcat 问题是您尝试在错误的状态下注册。您必须在 activity 状态恢复到恢复状态之前执行此操作。因此,要解决此问题,您必须在 activity 的 onCreate 方法中注册并持有启动器实例。然后任何时候你想开始另一个 activity 你都可以使用它。作为示例代码:
lateinit var launcher: ActivityResultLauncher
override fun onCreate(savedInstanceState: Bundle?) {
//The common logic of onCreate method
val launcher= registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if(it.resultCode == Activity.RESULT_OK){
val value = it.data?.getStringExtra("alternative")
listOfTasks.set(position, value.toString())
adapter.notifyDataSetChanged()
saveItems()
}
}
}
fun launchEditView(position: Int) {
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("taskName", listOfTasks.get(position))
launcher.launch(intent)
}
我有 2 个 类 MainActivity 和 EditActivity。我尝试在 MainActivity 中使用 registerForActivityResult() 启动 EditActivity,但应用程序立即退出; startActivity() 工作正常,但 registerForActivityResult() 符合我的目的,即将结果返回到 MainActivity。启动EditActivity的函数如下。
MainActivity.kt
fun launchEditView(position: Int) {
val getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if(it.resultCode == Activity.RESULT_OK){
val value = it.data?.getStringExtra("alternative")
listOfTasks.set(position, value.toString())
adapter.notifyDataSetChanged()
saveItems()
}
}
// first parameter is the context, second is the class of the activity to launch
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("taskName", listOfTasks.get(position))
getResult.launch(intent)
}
更新:错误是
java.lang.IllegalStateException: LifecycleOwner com.example.simpletodo.MainActivity@3a90598 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:682)
at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:691)
at com.example.simpletodo.MainActivity.launchEditView(MainActivity.kt:86)
您看到的 logcat 问题是您尝试在错误的状态下注册。您必须在 activity 状态恢复到恢复状态之前执行此操作。因此,要解决此问题,您必须在 activity 的 onCreate 方法中注册并持有启动器实例。然后任何时候你想开始另一个 activity 你都可以使用它。作为示例代码:
lateinit var launcher: ActivityResultLauncher
override fun onCreate(savedInstanceState: Bundle?) {
//The common logic of onCreate method
val launcher= registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if(it.resultCode == Activity.RESULT_OK){
val value = it.data?.getStringExtra("alternative")
listOfTasks.set(position, value.toString())
adapter.notifyDataSetChanged()
saveItems()
}
}
}
fun launchEditView(position: Int) {
val intent = Intent(this, EditActivity::class.java)
intent.putExtra("taskName", listOfTasks.get(position))
launcher.launch(intent)
}