Неправильний запитВведіть код у onActivityResult


310

Я починаю нову діяльність зі свого фрагмента

startActivityForResult(intent, 1);

і хочете обробити результат у батьківській активності фрагмента:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (requestCode == 1) {
        // bla bla bla
    }
}

Проблема полягає в тому, що я ніколи не отримував того, про що requestCodeя щойно опублікував startActivityForResult().

Я отримав - щось на зразок 0x40001, і 0x20001т.д. з випадковим вище бітом. Документи про це нічого не говорять. Будь-які ідеї?


Відповіді:


837

Ви телефонуєте startActivityForResult()зі свого Fragment. Коли ви це зробите, то requestCodeзначення змінюється тим Activity, кому належить Fragment.

Якщо ви хочете отримати правильне resultCodeу своїй діяльності, спробуйте:

Змінити:

startActivityForResult(intent, 1);

До:

getActivity().startActivityForResult(intent, 1);

44
Тому що він повинен вирішити, до якого фрагмента буде досягнутий результат. Тому коли The Fragment викликає StartActivityForResult. Код запиту буде змінено Діяльністю, тому він буде знати, як доставити результат до якого фрагмента. якщо ви дійсно хочете отримати результат в Activiy. просто зателефонуйте getActivity (). startActivityForResult ().
Changwei Yao

31
Лише зауваження: якщо ви використовуєте startActivityForResultфрагмент і очікуєте результату onActivityResultв цьому фрагменті, просто переконайтеся, що ви зателефонували super.onActivityResultв активності хоста (у випадку, якщо ви перекриєте цей метод там). Це тому, що діяльність, onActivityResultсхоже, називає фрагмент onActivityResult. Також зауважте, що код запиту, коли він подорожує по активності onActivityResult, змінюється, як пояснено у посиланні, яке Dimanoid розмістив у своїй відповіді нижче. Вам може не знати цього, але ніколи не знаєте ...
Ферран Мейлінч

31
"Код запиту змінено на Діяльність, яка володіє Фрагментом" - Треба любити дизайн Android ...
Tiago

13
Така важлива інформація, яку ви не можете знайти в документах де-небудь зрозуміло. Ви повинні любити дизайн Android, призначений зробити ваше життя пеклом.
Дрісс Бунуар

2
Чоловік, котрий я тебе люблю, я багато днів намагався зрозуміти цю проблему та виправити помилку, дякую!
tinyCoder

35

Код запиту не є помилковим. При використанні фрагментів бібліотеки підтримки v4 індекс фрагмента кодується у верхній 16 біт коду запиту, а ваш код запиту - у нижньому 16 біті. Індекс фрагмента пізніше використовується для пошуку правильного фрагмента для надання результату.

Отже, для діяльності розпочато об’єкт фрагмента форми, обробіть запит onActivityResultCode, як показано нижче:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

1
Чудова інформація, яка пояснює точну причину цього питання
Музикант

швидке запитання: що таке indexOfFragment?
Луї Цай

indexOfFragment - це індекс, який виробляє getSupportFragmentManager (). getFragments ()
HerberthObregon

25

Простіше:

Java : int unmaskedRequestCode = requestCode & 0x0000ffff

Котлін : val unmaskedRequestCode = requestCode and 0x0000ffff

Перевірте, чи є нижчі 16 бітів, просто розкрийте їх, виконуючи логічне І, а верхні 16 біт обнулені

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}

1
Чи можете ви сказати мені причину, чому він не дає початкового коду запиту?
K.Sopheak

3
Тому що CodeCode змінюється діяльністю, якій належить фрагмент. Дивіться відповідь Ашлеша Шарма
Хайме Агудо

дякую, це відповідь, яку я шукав. Я не розумію, чому Android не повинен повертати початковий код запиту.
тонісив

Це сьогодні було для мене надзвичайно корисним і насправді дуже добре пояснює проблему. Дякую!
Біллі Лаццаро

6

Якщо ви надаєте постійну інформацію, зробіть її загальнодоступною, а потім використовуйте startActivityResult

приклад:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

2

Ви також можете визначити
super.onActivityResult(requestCode, resultCode, data)
в цьому Activity(якщо ви перекриєте onActivityResult) це

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

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

і зателефонуйте startActivityForResult(intent, requestCode)всередину свогоFragment


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.