启动活动和意图附加项,似乎没有将附加项推送回来。

20

我有这段代码:

Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setData(ContactsContract.Contacts.CONTENT_URI);
        intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
        startActivityForResult(intent, PICK_CONTACT);

然后在响应中:

public void onActivityResult(int reqCode, int resultCode, Intent data) {


        switch (reqCode) {
            case (PICK_CONTACT):
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        Uri contactData = data.getData();
                        String onlineid = data.getStringExtra(EXTRA_ONLINE_ID);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
        super.onActivityResult(reqCode, resultCode, data);
    }

onlineid 变量为空。如何传递一个值并接收它的返回值?

编辑

我甚至尝试了,

Bundle extras = data.getExtras(); // returns null

检查 resultCode 必须为 -1,以便符合 Activity.RESULT_OK。 - Jorgesys
没问题,它进入了那个if语句,但是Extras为空。 - Pentium10
4个回答

6

这是有意为之的设计;系统活动不会将它们调用时所带的额外数据发送回来,因此您需要在其他地方管理数据。

幸运的是,resultCode参数完全由您自己控制,这意味着您可以使用它来索引您的数据。

private final int PICK_CONTACT = 0;
private Bundle[] myDataTransfer = { null };

...

Bundle myData = new Bundle();
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag());
myDataTransfer[PICK_CONTACT] = myData;
// create intent and all
startActivityForResult(intent, PICK_CONTACT);

...

public void onActivityResult(int reqCode, int resultCode, Intent data) {
    if (resultCode == PICK_CONTACT) {
        Bundle myData = myDataTransfer[resultCode];
        String onlineid = myData.getString(EXTRA_ONLINE_ID);
    }
}

我不是Java程序员,可能有更好的方法来实现Bundle的映射,但这样也可以工作 :)


1
当您启动一个活动时,您的活动可能会被销毁。因此,索引将消失。我认为你需要将Bundle持久化到应用程序内存之外的某个地方。 - rumpel
补充@rumpel的评论,您可以通过进入“设置”>“开发人员选项”并启用“不保留活动”来进行测试。这样,您就可以测试此用例,并发现除非在onSaveInstanceState中手动保存/恢复,否则myDataTransfer中的数据将被清除。 - strangetimes
这种情况下,即使在最理想的情况下也无法正常工作,因为您混淆了requestCode和resultCode。正确的签名是:onActivityResult(int requestCode,int resultCode,Intent data)。requestCode将始终为PICK_CONTACT,而resultCode通常为Activity.RESULT_OK == -1。 - Gavriel
@Gavriel,自从我上次回答这个问题以来已经很长时间了;你可能是对的,如果是这样,当你找到答案时,你可以考虑编写一个新的答案或编辑这个答案 :) - Ja͢ck

0

好的,请检查您的Activity android:launchMode是否配置为SingleTask或SingleInstance!那可能就是问题所在了 :)


嗨Pentium10,你解决了吗?我觉得你的代码没问题:S - Jorgesys
1
我没有解决。我认为我们传递给另一个活动的自定义额外信息没有被保留。 - Pentium10

0

必须在使用setResult启动的活动中设置EXTRA_ONLINE_ID字段。如果返回的Intent中没有设置该值(与您发送的不同),则会得到一个空值。


正如您所见,它使用了ContactsContract.Contacts.CONTENT_URI,这不是我的代码库的一部分。 - Pentium10
那我想也没办法了。问题是,你为什么要返回你已经拥有的数据呢? - Abhinav

-1

我也遇到了一些问题。

不要使用这行代码

 intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());

尝试

 intent.putExtra(EXTRA_ONLINE_ID, "" + v.getTag());

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