带有 Kotlin 的 Android - 将数据传回之前的 Activity

Posted

技术标签:

【中文标题】带有 Kotlin 的 Android - 将数据传回之前的 Activity【英文标题】:Android with Kotlin - pass data back to previous Activity 【发布时间】:2020-05-09 11:42:47 【问题描述】:

我想将数据从活动 2 传回活动 1,但它不起作用。我试图用 onActivityResult 解决,但它从来没有被调用过。

这是我的活动 1 - ProductsActivity

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        Log.v("onActivityResult", "onActivityResult")
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) 
            // 2
            if (resultCode == Activity.RESULT_OK) 
                // 3
                Log.v("onActivityResult", "onActivityResult")
            
        
    

这是我的第二个 Acitvity - DetailsProductAcitivity

override fun onBackPressed() 
        super.onBackPressed()
        Log.v("onActivityResult", "on back pressed")
        val intent = Intent(this, ProductsActivity::class.java)
        startActivityForResult(intent, 1)
    

【问题讨论】:

在这个例子中,你在哪里发送数据?你没有在意图中设置任何东西 super.onBackPressed() 会完成调用Activity,所以我相信是这个原因。 【参考方案1】:

它没有被调用,因为:

    您没有设置结果 您似乎正在创建一项新活动,而不是完成当前活动 (?)

在您的第一个活动中:

private fun launchNewActivity() 
    val requestCode = [yourCodeHere]
    val intent = Intent(this, ProductDetailsActivity::class.java)
    startActivityForResult(intent, requestCode)

在你的第二个活动中

private fun passProductAsResult(product: Product) 
    val data = Intent()
    data.putExtra("product", product.toString());

    setResult(Activity.RESULT_OK, data);
    finish()

回到你的第一个活动override方法onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
     if(resultCode != Activity.RESULT_OK) return
     when(requestCode) 
         [yourRequestCode] ->  yourTextView.text = data.getStringExtra("product"); 
         // Other result codes
         else -> 
     

如果您使用复杂数据类型,请确保数据类型为 SerializableParcelable

【讨论】:

非常感谢,它有效。我认为 startActivityForResult 在这里很重要。还有 setResult() 和 finish()【参考方案2】:

活动 1

startActivityForResult(intent, 1)

活动 2

override fun onBackPressed() 
        super.onBackPressed()        
        val intent = Intent()
        intent.putExtra("Key",data)
        setResult(RESULT_OK, intent);
        finish()

再次活动 1

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        Log.v("onActivityResult", "onActivityResult")
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) 
            if (resultCode == Activity.RESULT_OK) 
                //get extra data from data intent here
            
        

【讨论】:

你知道为什么resultCode是0而不是RESULT_OK吗?【参考方案3】:

在您的活动 2 中,您必须执行以下操作

override fun onBackPressed() 
        Log.v("onActivityResult", "on back pressed")
        val data = new Intent()
        data.putExtra(INTENT_PRODUCT_CHANGED, productChanged)
        //startActivityForResult(intent, 1)
        setResult(Activity.RESULT_OK, data)
        finish()    
    

你只需要删除super.onBackPressed()

【讨论】:

【参考方案4】:

你不应该使用

startActivityForResult(intent, 1)

但是

setResult(RESULT_OK, intent);
finish();

【讨论】:

谢谢。但是您必须从第一个 Activity 调用 startAcitivityForResult 才能启动第二个。【参考方案5】:

我还有一个问题。

onActivityResult 现在将被调用,但数据为空。结果代码为0。

活动一:

startActivityForResult(intent, 1)

还有这个

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    super.onActivityResult(requestCode, resultCode, data)
    if(requestCode == 1) 
        if (resultCode == Activity.RESULT_OK) 
            val resultString = data!!.getStringExtra(DetailsProductActivity.INTENT_PRODUCT_CHANGED)
        
    

活动二:

override fun onBackPressed() 
        super.onBackPressed()
        Log.v("onActivityResult", "on back pressed")
        val data = Intent()
        data.putExtra(INTENT_PRODUCT_CHANGED, productChanged)
        //startActivityForResult(intent, 1)
        setResult(Activity.RESULT_OK, data)
        finish()    
    

【讨论】:

你检查我的答案了吗?

以上是关于带有 Kotlin 的 Android - 将数据传回之前的 Activity的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Kotlin Android 扩展添加到我的项目

无法在带有 Kotlin 的 Android 中使用 Autodispose

带有 Java 和 Kotlin 文件、kapt 或 annotationProcessor 的 Android 项目?

带有 Kotlin 的 Android 中的 HTTP 请求

使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误

Android Kotlin:在 Fragment 下带有 Intent 的 setOnClickListener