我有一个名为 Location
的活动,可以从许多活动中调用,例如注册
和订单
活动。在Location
活动中,用户输入他的位置,因此Location
活动将把这个新位置返回给调用它的活动。
所以当注册
活动调用Location
活动时,它必须将数据返回给注册
活动。另一次,订单
活动也会做同样的事情。
注意
我知道你会告诉我应该发布代码,但我不是要求你给我代码;我只想要一些提示、链接或好的讨论。
我有一个名为 Location
的活动,可以从许多活动中调用,例如注册
和订单
活动。在Location
活动中,用户输入他的位置,因此Location
活动将把这个新位置返回给调用它的活动。
所以当注册
活动调用Location
活动时,它必须将数据返回给注册
活动。另一次,订单
活动也会做同样的事情。
我知道你会告诉我应该发布代码,但我不是要求你给我代码;我只想要一些提示、链接或好的讨论。
startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);
setData()
来返回结果。Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();
因此,在第一次活动中,您需要在onActivityResult()中编写以下代码:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == request_Code) {
if (resultCode == RESULT_OK) {
String returnedResult = data.getData().toString();
// OR
// String returnedResult = data.getDataString();
}
}
}
根据您的评论进行编辑: 如果您想返回三个字符串,则可以使用意图(intent)的键值对来实现,而不是使用Uri。
Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();
在onActivityResult中获取它们,如下所示:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == request_Code) {
if (resultCode == RESULT_OK) {
String street = data.getStringExtra("streetkey");
String city = data.getStringExtra("citykey");
String home = data.getStringExtra("homekey");
}
}
}
requestcode
是什么?我可以放任何整数吗? - user usernew Intent(this, OtherActivity.class);
我可以在一个Activity中使用这个代码。 - User2021年2月更新:
在 Activity v1.2.0 和 Fragment v1.3.0 中,引入了新的Activity Result APIs
。
Activity Result APIs 提供了用于注册结果、启动结果和处理系统分派的结果组件。
因此,不再需要使用 startActivityForResult
和 onActivityResult
。
为了使用新的 API,在您的原始 Activity 中创建一个 ActivityResultLauncher,指定回调函数,该函数将在目标 Activity 完成并返回所需数据时运行:
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("streetkey")
result.data?.getStringExtra("citykey")
result.data?.getStringExtra("homekey")
}
}
然后,每当需要时启动您的意图:
intentLauncher.launch(Intent(this, YourActivity::class.java))
为了从目标Activity返回数据,您只需添加一个带有要返回的值的intent到setResult()
方法中:
val data = Intent()
data.putExtra("streetkey", "streetname")
data.putExtra("citykey", "cityname")
data.putExtra("homekey", "homename")
setResult(Activity.RESULT_OK, data)
finish()
如需任何其他信息,请参阅Android文档
implementation 'androidx.fragment:fragment-ktx:1.3.6'
。 - Zohab AliresultCode
,你可以在finish()
之前调用setResult(int resultCode)
。...
if (everything_OK) {
setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
finish();
}
else {
setResult(Activity.RESULT_CANCELED); // some error ...
finish();
}
...
然后在您的调用活动中,检查resultCode
,以查看我们是否OK。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == someCustomRequestCode) {
if (resultCode == Activity.RESULT_OK) {
// OK!
}
else if (resultCode = Activity.RESULT_CANCELED) {
// something went wrong :-(
}
}
}
不要忘记使用startActivityForResult(intent, someCustomRequestCode)
来调用活动。
Activity.RESULT_OK
的值实际上是-1
,如果这让某些人感到困惑,我建议使用Activity
常量。 - jacoballenwoodresultCode = Activity.RESULT_CANCELED
,应该像这样实例化:resultCode == Activity.RESULT_CANCELED
==
嗨,
在我的情况下,我在回收器适配器中调用了finish()(在项目单击时)。
并且它在setResult(CODE, intent)之前被调用了。
如果上述所有方法都失败了,
请注释掉"finish();"并检查是否有其他地方调用了"finish();"。