-1

我有 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)
4

1 回答 1

0

您看到 logcat 的问题是您试图以错误的状态注册。您必须在该活动状态进入恢复状态之前执行此操作。因此,要解决此问题,您必须在活动的 onCreate 方法中注册并持有启动器实例。然后,任何时候你想开始另一个活动,你都可以使用它。作为示例代码:

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)
    } 
于 2021-12-30T06:54:47.347 回答