繁体   English   中英

带有 Kotlin 的 Android - 将数据传回上一个 Activity

[英]Android with Kotlin - pass data back to previous Activity

我想将数据从活动 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")
            }
        }
    }

这是我的第二个活动 - DetailsProductAcitivity

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

它没有被调用,因为:

  1. 你没有设置结果
  2. 您看起来像是在创建一个新活动而不是完成当前活动 (?)

在您的第一个活动中:

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(intent, 1)

活动二

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
            }
        }
}

在您的活动 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()

你应该使用不

startActivityForResult(intent, 1)

setResult(RESULT_OK, intent);
finish();

我还有一个问题。

现在将调用 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()    
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM