如何检索extra bundle选项?startActivityForResult(Intent intent,int requestCode,Bundle options)

6
根据Android文档public void startActivityForResult(Intent intent, int requestCode, Bundle options)

我不知道如何检索我在意图中传递的额外bundle选项。

我想在调用startActivityForResult方法时将一个包含数据的ArrayList作为额外的bundle选项传递。

代码示例:

ArrayList<String> list = new ArrayList<>();
        list.add("test1");
        list.add("test2");

        Bundle bundleOptions = new Bundle();
        bundleOptions.putStringArrayList("key", list);

startActivityForResult(intent, 10, bundleOptions);

在获取数据后:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)

Bundle extras = data.getExtras();

Bundle extras中不包含我试图传递的额外 Bundle。我错过了什么,无法检索我传递给该方法的额外 Bundle 数据?
我也尝试使用 intent.putExtra("key", bundleOptions);intent.putExtra("key", list);,但都没有成功,并调用方法 startActivityForResult(intent, 10);,但还是没有成功。
我确定我错过了什么,有人知道如何实现吗?

你是从哪里执行调用的?Fragment?Activity?onActivityResult在哪里?Intent data是null还是空的? - SagiLow
我在一个类的Activity中执行,然后在另一个类中检索数据。代码运行良好,我正在尝试在检索活动中传递额外参数。感谢您的时间和努力来帮助我。 - Thanos
你确定在结果回调被调用时发送方Activity仍然存活吗? - SagiLow
这是一个我不知道的问题,我怎么能确定呢?我可以检索意图的数据,但无法获取我尝试传递的额外参数。 - Thanos
从在onDestroy活动中添加日志消息和在结果回调中开始。 - SagiLow
2个回答

16

我相信我漏掉了什么。

我猜您可能误解了结果(result)的工作原理。

假设您有一个HomeActivity和一个SettingsActivityHomeActivity使用某些参数启动SettingsActivity,并想要知道一些结果。 这是如何运作的:

HomeActivity

这是如何打开SettingsActivity的:

public void openSettings() {
    Intent i = new Intent(this, SettingsActivity.class);
    i.putExtra("myParam", 1);
    startActivityForResult(i, 10);
}

SettingsActivity 关闭时,您将收到此调用:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 10) {
        if (resultCode == RESULT_OK) {
            // Get result from the result intent.
            String result = data.getStringExtra("myResult");

            // Do something with result...
        }
    }
}

设置活动

这只是必要的部分。读取输入,构建输出并关闭自身。我希望它足以进行演示。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Retrieve the parameter.
    int param = getIntent().getIntExtra("myParam");

    // Get a result somewhere.
    String resultValue = "RESULT=" + param;

    // Build a result intent and post it back.
    Intent resultIntent = new Intent();
    resultIntent.putExtra("myResult", resultValue);
    setResult(RESULT_OK, resultIntent);
    finish();
}

请查看此链接:http://developer.android.com/training/basics/intents/result.html


2
是的,我误解了如何使用它,因为我完全是新手Android开发者,而且我试图构建一些比较复杂的东西。感谢您的时间和努力。 - Thanos
感谢您的回答。 - Nice umang

10

Bundle extras 不包含我试图传递的额外的 bundle。

正确。

我漏了什么吗?

如果您想使用 getExtras() 检索值,请使用 putExtras() 或单个的 putExtra() 方法。

我无法检索到我传递给该方法的数据吗?

startActivity()/startActivityForResult() 的第三个参数是为了向 Android 本身传递选项,而不是向另一个活动传递数据。

我还尝试了... intent.putExtra("key", list); 但没有成功

一般来说,这是可行的。例如,自 Android 1.0 以来,这个示例应用程序 就可以正常工作。启动器活动使用 putExtra() 添加字符串 extra;另一个活动使用 getStringExtra() 获取值。

如果您在使用 putExtra() 方面遇到持续性问题,请发布一个单独的 Stack Overflow 问题,其中包含您设置和检索 extra 的代码以及对症状的详细描述。


1
太好了,我想我误解了如何使用 startActivityForResult()。由于您提到了"startActivity() / startActivityForResult() 的第三个参数是将选项传递给Android本身,而不是将数据传递给另一个activity",您能否提供一个示例?非常感谢您的时间和努力。 - Thanos
@Thanos:请查看ActivityOptions文档 - CommonsWare
是的,你说得对,有很多选项可以传递,这会使示例变得非常冗长。感谢指出链接。 - Thanos
@Thanos:更多的是因为我从未使用过它,也没有见过它被使用过,所以我手头没有任何例子。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接