【问题标题】:startActivityForResult and Intents Extras, it seems extras are not pushed backstartActivityForResult 和 Intents Extras,似乎 extras 没有被推回
【发布时间】:2011-02-21 00:52:26
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • Activity.RESULT_OK 检查 resultCode 必须为 -1
  • 没关系,如果是这样的话,但是Extras是空的。

标签: android android-intent extras


【解决方案1】:

这是设计使然;系统活动不会发回调用它们的附加信息,因此您必须在其他地方管理数据。

幸运的是,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 程序员,必须有更好的方法来实现 Bundles 的映射,但这很有效 :)

【讨论】:

  • 当您开始一项活动时,您的活动可能会被终止。所以索引将消失。我认为您需要将 Bundle 保存在应用程序内存之外的某个位置。
  • 要添加到@rumpel 的评论中,您可以通过进入设置> 开发人员选项并启用“不保留活动”来进行测试。这样,您将能够测试此用例并发现 myDataTransfer 中的数据将被清除,除非您在 onSaveInstanceState 中手动保存/恢复
  • 这甚至在最好的情况下都不起作用,因为你混合了 requestCode 和 resultCode。正确的签名是:onActivityResult(int requestCode, int resultCode, Intent data) 并且requestCode会一直是PICK_CONTACT,resultCode通常会是Activity.RESULT_OK==-1。
  • @Gavriel 我已经很久没有接触这个答案了;你可能是对的,在这种情况下,当你发现或编辑这个答案时,你可以考虑写一个新答案:)
【解决方案2】:

ok 检查您的 Activity android:launchMode 是否配置为 SingleTask 或 SingleInstance!那一定是问题:)

【讨论】:

  • 嗨 Pentium10,你解决了吗?我认为您的代码一切正常:S
  • 我没有解决。我认为我们传递给其他活动的自定义附加内容不会保留。
【解决方案3】:

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

【讨论】:

  • 如您所见,它使用 ContactsContract.Contacts.CONTENT_URI,它不属于我的代码库。
  • 我猜是没办法了。问题是,你为什么要返回你已经拥有的数据。
【解决方案4】:

我也遇到了一些问题。

代替这一行

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

试试

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

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多