Android startActivityForResult和Intent Extras,似乎Extras没有被推回
我有以下代码:Android startActivityForResult和Intent Extras,似乎Extras没有被推回,android,android-intent,extras,Android,Android Intent,Extras,我有以下代码: 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, P
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
确定检查您的活动android:launchMode是否配置为SingleTask或SingleInstance!这一定是问题所在:)我在这方面也遇到了一些问题 而不是这条线
intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
试一试
必须在使用setResult启动的活动中设置额外的在线ID字段。如果它没有在返回的意图中设置该值(与您发送的不同),那么您将得到一个空值。这是通过设计完成的;系统活动不会发回调用它们的额外数据,因此您必须在其他地方管理数据 幸运的是,
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程序员,必须有更好的方法来实现捆绑包映射,但这是可行的:)检查活动的结果代码必须是-1。结果_好的,如果是,则会进入该状态,但额外的是空的。嗨,奔腾10,你解决了这个问题吗?我认为您的代码中的一切都正常:SI未解决。我认为我们传递给其他活动的自定义附加内容没有保留。正如您所看到的,它使用的Contacts contract.Contacts.CONTENT\u URI不是我的代码库的一部分。我想这是情不自禁的。问题是,为什么要返回您已经拥有的数据。启动活动时,您的活动可能会被终止。因此,索引将消失。我认为您需要将捆绑包保存在应用程序内存之外的某个位置。若要通过@rumpel添加到注释中,您可以通过进入“设置”>“开发人员选项”并启用“不保留活动”来测试这一点。通过这种方式,您将能够测试此用例,并发现myDataTransfer中的数据将被删除,除非您在OnSaveInstanceState中手动保存/还原。这在最佳情况下甚至不起作用,因为在您混合了requestCode和resultCode。正确的签名是:onActivityResult(int requestCode,int resultCode,Intent data),请求代码将始终是PICK\u CONTACT,结果代码通常是Activity。RESULT\u OK==-1。@Gavriel我很久没有接触这个答案了;你可能是对的,在这种情况下,当你发现或编辑一个新的答案时,你可以考虑写一个新的答案:
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);
}
}