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
क्योंकि यह तय करना चाहिए कि कौन सा टुकड़ा परिणाम को वितरित करेगा। इसलिए जब द फ्रैगमेंट ने StartActivityForResult को कॉल किया। अनुरोध कोड गतिविधि द्वारा बदल दिया जाएगा, इसलिए यह पता चल जाएगा कि किस टुकड़े को परिणाम वितरित करना है। यदि आप वास्तव में एक्टीविटी में परिणाम प्राप्त करना चाहते हैं। बस कॉल getActivity ()। startActivityForResult ()।
चांगवेई याओ

31
बस एक नोट: यदि आप startActivityForResultएक टुकड़े में उपयोग करते हैं और onActivityResultउस टुकड़े से परिणाम की अपेक्षा करते हैं, तो बस सुनिश्चित करें कि आप super.onActivityResultहोस्ट गतिविधि में कॉल करते हैं (यदि आप उस विधि को वहां से हटाते हैं)। इसका कारण यह है कि गतिविधि के onActivityResultटुकड़े को कॉल लगता है onActivityResult। यह भी ध्यान दें कि अनुरोध कोड, जब वह गतिविधि के माध्यम से यात्रा करता है, तो उस onActivityResultलिंक में समझाया गया है जो कि डायनामॉइड ने अपने उत्तर में नीचे पोस्ट किया है। आपको यह जानने की आवश्यकता नहीं है लेकिन आप कभी नहीं जान सकते ...
फेरन मेलिनच

31
"RequestCode को उस गतिविधि द्वारा बदल दिया जाता है जो फ्रैगमेंट का मालिक है" - गॉट्टा को एंड्रॉइड डिज़ाइन पसंद है ...
टिआगो

13
इतनी महत्वपूर्ण जानकारी, कि आप डॉक्स में कहीं भी स्पष्ट नहीं पा सकते हैं। अपने जीवन को नरक बनाने के लिए डिज़ाइन किए गए एंड्रॉइड डिज़ाइन से प्यार करेंगे।
बजे ड्रिस बाउंउर

2
मैन आई लव यू, मैंने इस समस्या को समझने और त्रुटि को ठीक करने के लिए कई दिन बिताए, धन्यवाद!
छोटे

35

अनुरोध कोड गलत नहीं है। जब v4 समर्थन पुस्तकालय के टुकड़े का उपयोग करते हैं, तो खंड सूचकांक अनुरोध कोड के शीर्ष 16 बिट्स में एन्कोडेड है और आपका अनुरोध कोड नीचे के 16 बिट्स में है। परिणाम देने के लिए सही खंड को खोजने के लिए बाद में खंड सूचकांक का उपयोग किया जाता है।

इसलिए एक्टिविटीज़ के लिए फॉर्म फ्रेगमेंट ऑब्जेक्ट शुरू किया गया, onActivityResult request को हैंडल करें जैसे नीचे दिया गया है:

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

1
महान जानकारी जो इस मुद्दे का सटीक कारण बताती है
मुज़िकांत

त्वरित प्रश्न: indexOfFragment क्या है?
लुई त्सै

indexOfFragment वह सूचकांक है जो getSupportFragmentManager ()। getFragments () का उत्पादन करता है
HerberthObregon

25

आसान:

जावा : 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
कारण फ्रॉडमेंट का अनुरोध करने वाली गतिविधि द्वारा अनुरोधकोड को बदल दिया जाता है। आश्लेषा शर्मा उत्तर देखें
Jaime Agudo

धन्यवाद, यह वह उत्तर है जिसकी मुझे तलाश थी। मैं नहीं देखता कि 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


0

खुशबू में

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

, मुख्य गतिविधि में:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.