Android Studio中Activity Result Launcher处理RESULT_CANCELLED问题求助
解决Activity Result Launcher处理RESULT_CANCELLED的问题
1. 正确注册Activity Result Launcher
必须使用ActivityResultContracts.StartActivityForResult()这个通用Contract来注册,它能处理包括RESULT_CANCELLED在内的所有结果码。示例代码:
// 在宿主Activity的onCreate方法中完成注册 private val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> val resultTv = findViewById<TextView>(R.id.tv_result) when (result.resultCode) { Activity.RESULT_OK -> { // 处理成功返回的逻辑 val content = result.data?.getStringExtra("EXTRA_CONTENT") ?: "无返回数据" resultTv.text = "操作成功:$content" } Activity.RESULT_CANCELLED -> { // 这里就是你需要的取消结果处理逻辑 resultTv.text = "操作已取消" } } }
2. 启动目标Activity的正确方式
直接通过Launcher的launch方法传入Intent即可,无需额外处理:
findViewById<Button>(R.id.btn_start_activity).setOnClickListener { val intent = Intent(this, TargetActivity::class.java) activityResultLauncher.launch(intent) }
3. 目标Activity返回RESULT_CANCELLED的写法
- 系统默认行为:用户按返回键时,目标Activity会自动返回
RESULT_CANCELLED,无需额外代码。 - 手动触发取消:如果需要通过按钮主动返回取消状态,代码如下:
findViewById<Button>(R.id.btn_cancel).setOnClickListener { setResult(Activity.RESULT_CANCELLED) finish() }
常见错误排查
- 不要在返回
RESULT_CANCELLED时强行给Intent赋值额外数据,这完全没必要,反而可能干扰逻辑。 - 禁止在点击事件等动态场景重复注册Launcher,必须在
onCreate等生命周期方法中一次性完成注册。 - 如果重写了目标Activity的
onBackPressed方法,要确保调用setResult(Activity.RESULT_CANCELLED)后再执行finish(),否则会丢失结果码。
内容的提问来源于stack exchange,提问作者P47HF1ND3R
相关产品推荐
相关产品推荐

