带有 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 ->
如果您使用复杂数据类型,请确保数据类型为 Serializable
或 Parcelable
。
【讨论】:
非常感谢,它有效。我认为 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 中使用 Autodispose
带有 Java 和 Kotlin 文件、kapt 或 annotationProcessor 的 Android 项目?
带有 Kotlin 的 Android 中的 HTTP 请求