OnActivityResult içinde yanlış requestCode


310

Parçamdan yeni bir Faaliyete başlıyorum

startActivityForResult(intent, 1);

ve sonucu Parçanın üst Etkinliğinde işlemek istiyorsanız:

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

Sorun şu ki, requestCodeben daha yeni yayınladım startActivityForResult().

Ben böyle bir şey var 0x40001, 0x20001rastgele bir yüksek bit kümesiyle vb. Dokümanlar bu konuda hiçbir şey söylemiyor. Herhangi bir fikir?


Yanıtlar:


837

Aradığınız startActivityForResult()hesabınızla ilgili Fragment. Bunu yaptığınızda , sahip olan requestCodetarafından değiştirilir .ActivityFragment

resultCodeFaaliyetinizde doğru olanı almak istiyorsanız şunu deneyin:

Değişiklik:

startActivityForResult(intent, 1);

Kime:

getActivity().startActivityForResult(intent, 1);

44
Çünkü hangi parçanın sonucu vereceğine karar vermelidir. Parça ne zaman StartActivityForResult çağırır. requestCode, Etkinlik tarafından değiştirilecektir, bu nedenle sonucun hangi parçaya nasıl dağıtılacağını bilecektir. gerçekten Activiy'de sonuç almak istiyorsanız. getActivity () öğesini çağırmanız yeterlidir startActivityForResult ().
Changwei Yao

31
Sadece bir not: startActivityForResultBir parçada kullanırsanız ve onActivityResulto parçadan sonuç beklerseniz, super.onActivityResultana bilgisayar etkinliğini çağırdığınızdan emin olun (bu yöntemi orada geçersiz kılmanız durumunda). Çünkü aktivitenin onActivityResultparçayı çağırdığı görülüyor onActivityResult. Ayrıca, istek kodunun, etkinliklerden geçerken, onActivityResultDimanoid'in aşağıdaki cevabında yayınladığı bağlantıda açıklandığı gibi değiştirildiğini unutmayın. Bunu bilmeniz gerekmeyebilir ama asla bilemezsiniz ...
Ferran Maylinch

31
"requestCode, Fragment'in sahibi olan Etkinlik tarafından değiştirildi" - Android tasarımını çok sevmeliyiz ...
Tiago

13
Böylesine önemli bir bilgi, dokümanlarda net bir yerde bulamıyorsunuz. Hayatınızı cehenneme çevirmek için tasarlanmış android tasarımını sevmeliyim.
Driss Bounouar

2
Seni seviyorum dostum, bu sorunu anlamaya ve hatayı düzeltmeye çalışarak günler geçirdim, teşekkürler!
tinyCoder

35

İstek kodu yanlış değil. V4 destek kitaplığı parçalarını kullanırken, parça dizini istek kodunun en üst 16 bitine kodlanır ve istek kodunuz en alt 16 bittir. Parça dizini daha sonra sonucu vermek için doğru parçayı bulmak için kullanılır.

Bu nedenle Faaliyetler için fragman nesnesi başlatıldı, onActivityResult requestCode'u aşağıdaki gibi kullanın:

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

1
Bu sorunun tam nedenini açıklayan harika bilgi
Muzikant

hızlı soru: indexOfFragment nedir?
Louis Tsai

indexOfFragment, getSupportFragmentManager (). getFragments () tarafından üretilen dizindir
HerberthObregon

25

Daha kolay:

Java : int unmaskedRequestCode = requestCode & 0x0000ffff

Kotlin : val unmaskedRequestCode = requestCode and 0x0000ffff

Alt 16 biti kontrol edin, sadece mantıksal bir AND ve üst 16 bit sıfırlanmış olarak maskesini kaldırın

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff

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

    }
}

1
Orijinal istek kodunu vermemesinin nedenini söyleyebilir misiniz?
K.Sopheak

3
Çünkü requestCode, Parçanın sahibi olan Etkinlik tarafından değiştirilir. Ashlesha Sharma'nın cevabı
Jaime Agudo

teşekkür ederim, aradığım cevap bu. Android'in neden orijinal istek kodunu döndürmemesi gerektiğini anlamıyorum.
Ocak'ta tonisifler

Bu bugün benim için son derece yardımcı oldu ve aslında sorunu gerçekten güzel açıklıyor. Teşekkürler!
Billy Lazzaro

6

Sürekli sağlıyorsanız, herkese açık yapın ve startActivityResult

misal:

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

2

Ayrıca tanımlayabilirsiniz
super.onActivityResult(requestCode, resultCode, data)
içinde Activity(eğer geçersiz ise onActivityResultşuna)

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

        ...

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

ve startActivityForResult(intent, requestCode)içinde araFragment


0

Fragment içinde

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

Ana Faaliyet Alanında:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.