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?


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);

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)

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

    }
}

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);

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


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
            }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.