我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
当前回答
2021年3月更新
在Activity v1.2.0和Fragment v1.3.0中,引入了新的活动结果api。
Activity Result api提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。
因此不再需要使用startActivityForResult和onActivityResult。
为了使用新的API,你需要在你的源Activity中创建一个ActivityResultLauncher,指定当目标Activity完成并返回所需数据时将运行的回调:
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("key1")
result.data?.getStringExtra("key2")
result.data?.getStringExtra("key3")
}
}
然后,在你需要的时候启动你的intent:
intentLauncher.launch(Intent(this, YourActivity::class.java))
为了从目标Activity中返回数据,你只需要添加一个返回setResult()方法的值的意图:
val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")
setResult(Activity.RESULT_OK, data)
finish()
如需更多信息,请参考Android文档
其他回答
只是一个小细节,我认为是错过了以上的答案。
如果你的子活动可以从多个父活动中打开,那么你可以根据你的活动是由startActivity还是startActivityForResult打开来检查你是否需要做setResult。您可以通过使用getCallingActivity()来实现这一点。更多信息请点击这里。
根据具体情况,有几种方法可以达到你想要的效果。
最常见的场景(听起来就是你的场景)是使用子活动获取用户输入——比如从列表中选择联系人或在对话框中输入数据。在这种情况下,你应该使用startActivityForResult来启动你的子Activity。
这提供了一个使用setResult将数据发送回主Activity的管道。setResult方法接受一个int结果值和一个Intent,该Intent被传递回调用Activity。
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
要访问调用Activity中返回的数据,重写onActivityResult。requestCode对应于startActivityForResult调用中传递的整数,而resultCode和data Intent则从子Activity返回。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (MY_CHILD_ACTIVITY) : {
if (resultCode == Activity.RESULT_OK) {
// TODO Extract the data returned from the child Activity.
String returnValue = data.getStringExtra("some_key");
}
break;
}
}
}
另一种实现预期结果的方法(根据您的情况可能更好)是创建侦听器接口。
通过使父活动侦听由子活动触发的接口,同时将所需的数据作为参数传递,可以创建类似的环境集
2021年3月更新
在Activity v1.2.0和Fragment v1.3.0中,引入了新的活动结果api。
Activity Result api提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。
因此不再需要使用startActivityForResult和onActivityResult。
为了使用新的API,你需要在你的源Activity中创建一个ActivityResultLauncher,指定当目标Activity完成并返回所需数据时将运行的回调:
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("key1")
result.data?.getStringExtra("key2")
result.data?.getStringExtra("key3")
}
}
然后,在你需要的时候启动你的intent:
intentLauncher.launch(Intent(this, YourActivity::class.java))
为了从目标Activity中返回数据,你只需要添加一个返回setResult()方法的值的意图:
val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")
setResult(Activity.RESULT_OK, data)
finish()
如需更多信息,请参考Android文档
使用startActivityForResult()方法调用子活动Intent
这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html
在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen