startActivityForResult и Intents 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, 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

person Pentium10    schedule 18.05.2010    source источник
comment
проверьте, что resultCode должен быть -1 для Activity.RESULT_OK   -  person Jorgesys    schedule 19.05.2010
comment
то ладно, влезает в это если, но в Доп пусто.   -  person Pentium10    schedule 19.05.2010


Ответы (4)


Это сделано по замыслу; системные действия не будут возвращать дополнительные функции, с которыми они были вызваны, поэтому вам придется управлять данными в другом месте.

К счастью, параметр 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, но это работает :)

person Ja͢ck    schedule 18.04.2013
comment
Когда вы начинаете активность, ваша активность может быть убита. Таким образом, индекс исчезнет. Я думаю, вам нужно будет сохранить Bundle где-то за пределами памяти вашего приложения. - person rumpel; 11.02.2015
comment
Чтобы добавить к комментарию @rumpel, вы можете проверить это, зайдя в «Настройки» > «Параметры разработчика» и включив «Не сохранять действия». Таким образом, вы сможете протестировать этот вариант использования и обнаружить, что данные в myDataTransfer будут уничтожены, если вы не сохраните/не восстановите вручную в onSaveInstanceState. - person strangetimes; 03.09.2016
comment
это даже не работает в лучшем случае, потому что вы смешали requestCode и resultCode. Правильная подпись: onActivityResult(int requestCode, int resultCode, Intent data) И requestCode всегда будет PICK_CONTACT, а resultCode обычно будет Activity.RESULT_OK==-1. - person Gavriel; 13.11.2019
comment
@ Гавриэль, я давно не касался этого ответа; вы, вероятно, правы, и в этом случае вы могли бы подумать о написании нового ответа, когда узнаете или отредактируете этот :) - person Ja͢ck; 13.11.2019

ok Проверьте, настроена ли ваша активность android:launchMode как SingleTask или SingleInstance! наверное проблема в этом :)

person Jorgesys    schedule 18.05.2010
comment
Привет, Pentium10, ты решил это? Я думаю, что все в порядке в вашем коде: S - person Jorgesys; 02.06.2010
comment
Я не решил. Я думаю, что пользовательские дополнения, которые мы передаем этому другому действию, не сохраняются. - person Pentium10; 26.06.2010

Поле EXTRA_ONLINE_ID должно быть установлено в активности, которую вы запустили с помощью setResult. Если он не устанавливает это значение в возвращенном намерении (которое отличается от того, что вы отправили), вы получите нулевое значение.

person Abhinav    schedule 15.03.2011
comment
Как вы видите, он использует ContactsContract.Contacts.CONTENT_URI, который не является частью моего кода. - person Pentium10; 15.03.2011
comment
Ничего не могу поделать, тогда я думаю. Вопросы в том, почему вы хотите вернуть данные, которые у вас уже есть. - person Abhinav; 15.03.2011

Я тоже столкнулся с некоторыми проблемами с этим.

Вместо этой строки

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

Пытаться

 intent.putExtra(EXTRA_ONLINE_ID, "" + v.getTag());
person Dom    schedule 04.08.2010