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

use*_*ser 112 android android-activity onactivityresult

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

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

注意

我知道你会告诉我我应该发布代码,但我不是要你给我代码; 我只想要一些提示,链接或好线程.

Kan*_*nth 226

为了启动一个应该将结果返回给调用活动的活动,您应该执行以下操作.您应该传递如下所示的请求代码,以便确定您从您开始的活动中获得了结果.

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);
Run Code Online (Sandbox Code Playgroud)

在活动中,您可以使用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();
Run Code Online (Sandbox Code Playgroud)

那么在第一个活动中再次在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据你的评论编辑: 如果你想返回三个字符串,那么通过使用意图而不是使用Uri的键/值对来遵循这一点.

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();
Run Code Online (Sandbox Code Playgroud)

将它们放入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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

2021 年 2 月更新

Activity v1.2.0Fragment 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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后,在需要时启动您的意图:

intentLauncher.launch(Intent(this, YourActivity::class.java))
Run Code Online (Sandbox Code Playgroud)

要从目标 Activity 返回数据,您只需添加一个包含要返回到setResult()方法的值的意图:

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

setResult(Activity.RESULT_OK, data)
finish()
Run Code Online (Sandbox Code Playgroud)

有关任何其他信息,请参阅Android 文档


len*_*ooh 5

如果你想完成并只添加一个resultCode(没有数据),你可以调用setResult(int resultCode)before finish()

例如:

...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...
Run Code Online (Sandbox Code Playgroud)

然后在您的呼叫活动中,检查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 :-(
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记使用 来调用该活动startActivityForResult(intent, someCustomRequestCode)

  • `Activity.RESULT_OK` 的值实际上是 `-1`,以防有人感到困惑。我只是建议使用“Activity”常量 (4认同)