Kode permintaan salah di onActivityResult

310

Saya memulai Kegiatan baru dari Fragmen saya dengan

startActivityForResult(intent, 1);

dan ingin menangani hasilnya dalam Aktivitas induk Fragmen:

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

Masalahnya adalah saya tidak pernah mendapatkan requestCodeposting yang baru saya posting startActivityForResult().

Saya mendapatkan sesuatu seperti 0x40001, 0x20001dll. Dengan set bit acak yang lebih tinggi. Dokter tidak mengatakan apa-apa tentang ini. Ada ide?

Dimanoid
sumber
kemungkinan duplikat dari onActivityResult tidak dipanggil dalam Fragmen
PhoneixS

Jawaban:

837

Anda menelepon startActivityForResult()dari Anda Fragment. Ketika Anda melakukan ini, requestCodeitu diubah oleh Activityyang memiliki Fragment.

Jika Anda ingin mendapatkan yang benar resultCodedalam aktivitas Anda coba ini:

Perubahan:

startActivityForResult(intent, 1);

Untuk:

getActivity().startActivityForResult(intent, 1);
Changwei Yao
sumber
44
Karena itu harus memutuskan fragmen mana yang akan memberikan hasilnya. Maka ketika The Fragment memanggil StartActivityForResult. requestCode akan diubah oleh Activity, jadi ia akan tahu bagaimana mengirimkan hasil ke fragmen mana. jika Anda benar-benar ingin mendapatkan hasilnya di Activiy. panggil saja getActivity (). startActivityForResult ().
Changwei Yao
31
Hanya sebuah catatan: jika Anda menggunakan startActivityForResultdalam sebuah fragmen dan mengharapkan hasil dari onActivityResultdalam fragmen itu, pastikan Anda memanggil super.onActivityResultaktivitas host (jika Anda mengganti metode itu di sana). Ini karena aktivitasnya onActivityResultsepertinya menyebut fragmen itu onActivityResult. Juga, perhatikan bahwa kode permintaan, ketika melakukan perjalanan melalui aktivitas onActivityResult, diubah seperti yang dijelaskan dalam tautan yang Dimanoid kirimkan dalam jawabannya di bawah ini. Anda mungkin tidak perlu tahu itu, tetapi Anda tidak pernah tahu ...
Ferran Maylinch
31
"requestCode diubah oleh Activity yang memiliki Fragment" - Harus menyukai desain Android ...
Tiago
13
Informasi penting seperti itu, yang tidak dapat Anda temukan dengan jelas di dalam dokumen. Harus menyukai desain android yang dirancang untuk membuat hidup Anda seperti neraka.
Driss Bounouar
2
Man aku mencintaimu, aku menghabiskan banyak hari mencoba memahami masalah ini dan memperbaiki kesalahan, terima kasih!
tinyCoder
35

Kode permintaan tidak salah. Saat menggunakan fragmen pustaka dukungan v4, indeks fragmen dikodekan dalam 16 bit teratas dari kode permintaan dan kode permintaan Anda ada di 16 bit terbawah. Indeks fragmen kemudian digunakan untuk menemukan fragmen yang benar untuk memberikan hasil.

Oleh karena itu untuk Kegiatan mulai dari objek fragmen, menangani permintaan Kode onActivityResult seperti di bawah:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)
Ashlesha Sharma
sumber
1
Info hebat yang menjelaskan penyebab pasti masalah ini
Muzikant
pertanyaan cepat: apa itu indexOfFragment?
Louis Tsai
indexOfFragment adalah indeks yang getSupportFragmentManager (). getFragments () menghasilkan
HerberthObregon
25

Lebih mudah:

Jawa : int unmaskedRequestCode = requestCode & 0x0000ffff

Kotlin : val unmaskedRequestCode = requestCode and 0x0000ffff

Periksa 16 bit yang lebih rendah, buka tabnya saja melakukan logika DAN dengan 16 bit atas memusatkan perhatian

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff

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

    }
}
Jaime Agudo
sumber
1
Bisakah Anda memberi tahu saya alasan mengapa tidak memberikan kode permintaan asli?
K.Sopheak
3
Karena requestCode diubah oleh Activity yang memiliki Fragmen. Lihat jawaban Ashlesha Sharma
Jaime Agudo
terima kasih, ini adalah jawaban yang saya cari. Saya tidak mengerti mengapa Android seharusnya tidak mengembalikan kode permintaan asli.
tonisives
Ini sangat membantu saya hari ini dan benar-benar menjelaskan masalahnya dengan sangat baik. Terima kasih!
Billy Lazzaro
6

Jika Anda memberikan konstan, publikasikan dan gunakan startActivityResult

contoh:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
Nilesh Tiwari
sumber
2

Anda juga dapat menentukan
super.onActivityResult(requestCode, resultCode, data)
dalam Activity(jika Anda menimpa onActivityResult) di ini

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

        ...

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

dan panggil ke startActivityForResult(intent, requestCode)dalamFragment

TarikW
sumber
0

dalam Fragment

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

dalam Kegiatan Utama:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
Pengecualian Null Pointer
sumber