Android: 如何让一个活动返回调用它的活动的结果?

我有一个 Location活动,可以从许多活动中调用,如 Sign upOrder。在 Location活动中,用户输入他的位置,因此活动 Location将把这个新位置返回给调用它的活动。

因此,当 Sign up活动调用 Location活动时,它必须将数据返回给 Sign up活动。另一次 Order活动将做同样的事情。

注意

我知道你会告诉我,我应该张贴的代码,但我不是要求你给我的代码,我只是想一些提示,链接或良好的线程。

156519 次浏览

为了启动一个应该返回结果给调用活动的活动,您应该执行如下操作。您应该传递如下所示的 request 代码,以标识您从启动的活动中获得的结果。

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();
}
}
}

根据你的评论进行编辑: 如果您想返回三个字符串,那么按照这个步骤使用带有意图的键/值对,而不是使用 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");
}
}
}

如果您想完成并且只添加一个 resultCode(没有数据) ,您可以在 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,看看我们是否确定。

@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)调用活动。

您的错误在 resultCode = Activity.RESULT_CANCELED中,您应该像 resultCode == Activity.RESULT_CANCELED = = 那样实例化

更新日期: 2021年2月

活动 v1.2.0片段 v1.3.0一样,新的 Activity Result APIs已经被引入。

Activity Result API 提供了用于注册结果、启动结果以及在系统发送结果后处理结果的组件。

所以再也不需要使用 startActivityForResultonActivityResult了。

为了使用新的 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 返回数据,只需要添加一个带有返回值的意图到 setResult()方法:

val data = Intent()
data.putExtra("streetkey", "streetname")
data.putExtra("citykey", "cityname")
data.putExtra("homekey", "homename")


setResult(Activity.RESULT_OK, data)
finish()

如需更多资料,请参阅 Android 文档