我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了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文档
其他回答
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文档
使用sharedPreferences并保存数据并从应用程序中的任何地方访问它
像这样保存日期
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
然后像这样接收数据
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String savedPref = sharedPreferences.getString(key, "");
mOutputView.setText(savedPref);
只是一个小细节,我认为是错过了以上的答案。
如果你的子活动可以从多个父活动中打开,那么你可以根据你的活动是由startActivity还是startActivityForResult打开来检查你是否需要做setResult。您可以通过使用getCallingActivity()来实现这一点。更多信息请点击这里。
另一种实现预期结果的方法(根据您的情况可能更好)是创建侦听器接口。
通过使父活动侦听由子活动触发的接口,同时将所需的数据作为参数传递,可以创建类似的环境集
使用startActivityForResult()方法调用子活动Intent
这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html
在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen