为何Kotlin中转换Activity后仍无法运行Anko的startActivityForResult?
首先咱们来拆解你遇到的问题:你使用Anko的泛型startActivityForResult扩展函数时无法运行,哪怕把AppCompatActivity转成Activity也没用。主要原因可能集中在这几个点:
1. 未正确导入Anko的扩展函数
Anko的startActivityForResult<T>是一个扩展函数,必须确保你已经导入了对应的包。在代码顶部需要添加:
import org.jetbrains.anko.startActivityForResult
如果你的项目用了AndroidX,还要保证依赖的是适配AndroidX的Anko库,在Module级别的build.gradle里添加:
implementation "org.jetbrains.anko:anko-appcompat-v7-commons:0.10.8"
(版本号可根据实际需求调整,0.10.8是适配AndroidX的稳定版本)
2. 不必要的Context强转
你的UIMain本身就是AppCompatActivity(它是Activity的子类),完全不需要把mContext强转成Activity,直接用this调用扩展函数就行。修改后的代码应该是:
startActivityForResult<UIAddEditBackup>(1, "id" to 2L)
或者明确指定this也可以:
this.startActivityForResult<UIAddEditBackup>(requestCode = 1, "id" to 2L)
3. Anko版本与AndroidX的兼容性冲突
如果你的项目已经迁移到AndroidX,但用的是适配旧support库的Anko版本,就会出现兼容性问题。这种情况下必须切换到Anko的AndroidX分支依赖,也就是上面提到的anko-appcompat-v7-commons,而不是旧的anko-support-v7-commons。
更推荐的替代方案:使用AndroidX官方的Activity Result API
另外要注意,startActivityForResult本身已经被Android官方弃用,Anko也早已停止维护。如果是新项目,更建议使用AndroidX的Activity Result API,示例代码如下:
class UIMain : AppCompatActivity() { private val editBackupLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // 处理返回结果 val data = result.data // 这里写你的结果逻辑 } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.layout_main) // 启动UIAddEditBackup val intent = Intent(this, UIAddEditBackup::class.java).apply { putExtra("id", 2L) } editBackupLauncher.launch(intent) } }
这种方式不仅能避开Anko的兼容性坑,还能贴合Android官方的API规范。
内容的提问来源于stack exchange,提问作者HelloCW

