StartActivityForResult का उपयोग करके, चाइल्ड एक्टिविटी में रिक्वेस्टकोड कैसे प्राप्त करें?


85

मेरी चार गतिविधियाँ हैं, A, B, C और D कहते हैं। मेरी स्थिति A है, गतिविधि B को startActivityForResult द्वारा शुरू करेंगे।

startActivityForResult(new Intent(this,B.class),ONE);

अन्य स्थिति में मैं अन्य स्थिति के साथ बी करूंगा। पसंद

 startActivityForResult(new Intent(this,B.class),TWO);

बी में, मुझे अनुरोधकोड के आधार पर सी या डी को कॉल करने की आवश्यकता है। Ie अगर किसी को C और D. शुरू करने की आवश्यकता है
तो मुझे यह जानने की आवश्यकता है कि चाइल्ड एक्टिविटी (B यहाँ) में अनुरोधकोड की जाँच कैसे करें।
दूसरे शब्दों में, मैं अनुरोध कोड प्राप्त करना चाहता हूं जिसे गतिविधि बी के साथ शुरू किया गया था।

जवाबों:


137

आप अतिरिक्त डालकर अनुरोध कोड पारित कर सकते हैं।

intent.putExtra("requestCode", requestCode);   

या यदि आप का इस्तेमाल किया है startActivityForResultप्रत्येक को संपादित करने के लिए कई बार, तो बेहतर है, तो आप कर सकते हैं अपने में , तुम वहाँ कोड इस तरह जोड़ने overridestartActivityForResultActivity

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

तो अपने सभी startActivityForResult को संपादित करने की आवश्यकता नहीं है।
आशा है कि यह आपकी मदद करता है


49
क्या वास्तव में किसी बच्चे की गतिविधि के लिए उसका अनुरोध कोड प्राप्त करने का कोई तरीका नहीं है?
I_am_jorf

1
अब तक के अपने सर्वश्रेष्ठ ज्ञान के लिए, मुझे लगता है कि कोई और रास्ता नहीं है।
लबीब पानमपुलन

17
एक ही बात सोच रहा था - यह एंड्रॉइड एपीआई में उन चीजों में से एक है जो किसी भी तार्किक समझ में नहीं आता है।
आर्टेम रसाकोवस्की

7
startActivityForResult का उपयोग अन्य ऐप्स में गतिविधियाँ शुरू करने के लिए किया जा सकता है, requestCode आपके ऐप का निजी मामला है। इस प्रकाश में यह समझ में आता है कि इंटेंट के पास ऐसी कोई विधि नहीं है और सही दृष्टिकोण सेटएक्शन के लिए सलाह देना है जो आप गतिविधि करना चाहते हैं।
मैकीज बेसिकिक

27

अनुरोध कोड शुरू की गई गतिविधि के लिए स्वचालित रूप से पारित नहीं किया जाता है क्योंकि यह इस मूल्य को जानने (और नहीं करना) चाहिए। यह केवल यह जानना है कि क्या करना है और कहां से शुरू किया गया था।

एक गतिविधि शुरू करना वास्तव में एक विधि को कॉल करने का दूसरा रूप है। जब आप किसी विधि को कॉल करते हैं, तो आप परिणाम को समकालिक रूप से प्राप्त करते हैं (वहीं जहां आपने कॉल किया था)। इस मामले में आप केवल उस जानकारी से गुजर रहे हैं जो विधि को अपना काम करने की आवश्यकता है। आप यह नहीं बता रहे हैं कि आपने इसे कहां से बुलाया है।

एक गतिविधि शुरू करना एक विधि को कॉल करने का अतुल्यकालिक एनालॉग है, जिस स्थिति में आप विशेष विधि onActivityResult () में परिणाम प्राप्त करते हैं। इस पद्धति में, आपको यह जानना होगा कि आपके द्वारा प्राप्त परिणाम का क्या करना है और इसके लिए आपके पास अनुरोध कोड है।

यह स्पष्ट करने के लिए कि पैरामीटर के रूप में अनुरोध कोड को पारित करना एक अच्छा विचार क्यों नहीं है, उदाहरण गतिविधि पर विचार करें जो एक उत्पाद दिखा रहा है जिसे आप खरीद सकते हैं। इस गतिविधि पर "खरीदें" और "लॉगिन" लेबल वाले दो बटन हैं (जैसा कि आप वर्तमान में लॉग इन नहीं हैं)। "लॉगिन" दबाने पर "लॉगिन" नाम की एक गतिविधि शुरू होगी जो प्रदान की गई जानकारी का उपयोग करके उपयोगकर्ता में लॉग इन करने का प्रयास करेगी। "खरीदें" दबाने पर सबसे पहले "लॉगिन" गतिविधि शुरू होगी और यदि लॉगिन सफल रहा, तो खरीदारी गतिविधि शुरू करें।

अब, लॉगिन गतिविधि शुरू करने के लिए "लॉगिन" बटन अनुरोध कोड 1 का उपयोग करता है, लेकिन "खरीदें" बटन उसी अनुरोध कोड का उपयोग नहीं कर सकता है क्योंकि लॉगिन सफल होने पर उसे कुछ अलग करना होगा। तो, "खरीदें" बटन अनुरोध कोड 2 का उपयोग करता है।

"लॉगिन" गतिविधि में आपको दो अलग-अलग अनुरोध कोड प्राप्त हो सकते हैं, जिसके आधार पर इसे कहां से बुलाया गया था, लेकिन आपको उसी प्रक्रिया को करने की आवश्यकता होगी।

इसलिए, यदि आप एक पैरामीटर के रूप में अनुरोध कोड में पास करते हैं, तो आप उस कोड के साथ समाप्त हो जाएंगे, जिसे कुछ अलग-अलग अनुरोध कोडों के लिए एक ही सामान करने की आवश्यकता है, जैसे:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

आप केंद्रीय स्थान जैसे अनुरोध कोड नाम के वर्ग में अनुरोध कोड स्थिरांक को संग्रहीत करने के साथ भी समाप्त हो जाएंगे।

संक्षेप में, अनुरोध कोड का उपयोग केवल यह तय करने के लिए किया जाना चाहिए कि प्राप्त परिणाम के साथ क्या करना है। इस तरह आप एक अधिक मॉड्यूलर के साथ समाप्त हो जाएगा, बनाए रखने के लिए आसान और कोड का विस्तार करने के लिए आसान।


1
क्या होगा यदि यह सॉर्ट का "प्रबंधक" है और आप एक निश्चित मूल्य (एक्स्ट्रा में सहेजे गए मूल्य) को "बचाने" के लिए एक अनुरोध कोड चाहते हैं। एक अन्य अनुरोध कोड जो एक मान (और एक्स्ट्रा में वापसी) को "फिर से शुरू करेगा" लेकिन इस गतिविधि के भीतर वे सहेजे गए मानों जैसे नाम बदलने, संपादन, हटाने आदि का प्रबंधन भी कर सकते हैं, आपके विचार क्या हैं? मुझे लगता है कि यह समान कार्य करने के लिए कोड / गतिविधियों की नकल करने से रोकेगा।
JRomero

@ J.Romero ऐसा मत करो, यह सिर्फ चीजों को जटिल करेगा। बस उस कार्यक्षमता को एक उपयोगिता (यूटिलिटी / सिंगलटन) वर्ग में रखें। तुम भी हैंडलर और सेवा
Szabolcs Berecz

3
यदि यह "इस मूल्य को जानने की जरूरत नहीं है" तो भी बच्चे की गतिविधि अगली श्रृंखला में मूल्य को पास करने की आवश्यकता हो सकती है। विडंबना यह है कि हमें इसके लिए अधिक अनावश्यक कोड लिखने की आवश्यकता है। किसी ऐसी चीज के लिए जिसे हमें जानने की जरूरत नहीं है कि हमें जो करना चाहिए उसके बारे में पढ़ने के लिए हमें और अधिक व्याख्यान मिलेगा।
user250343

मैं नहीं देखता कि यह कैसे दिखाता है कि एक बच्चे की गतिविधि को अनुरोध कोड तक पहुंच से वंचित क्यों किया जाना चाहिए। मुझे यह भी पता नहीं है कि क्यों अब खरीदने के लिए और विशेष रूप से दो अलग-अलग गतिविधियों के लिए कॉल पर विचार करके आपके विशेष उदाहरण में अनुरोध कोड तक पहुंच आवश्यक होगी।
द्राजन बेज़ेलोवुक

1
@EvanR। शायद एक बेहतर आर्किटेक्चर "मास्टर" आइटम गतिविधि को अलग-अलग ऐड / एडिट गतिविधियों में शामिल करना होगा। इसलिए कोड का न्यूनतम उपयोग है, लेकिन प्रत्येक गतिविधि को स्वतंत्र रूप से लागू किया जा सकता है।
डेन पॉवेल

11

मैंने लॉन्चिंग एक्टिविटी को इस तरह की जानकारी को पास करने के लिए कस्टम इंटेंट एक्शन का उपयोग किया।

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

तो फिर तुम जैसे जाओगे:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

और गतिविधि में Bआपको आसानी से कार्रवाई मिलती है:

getIntent().getAction();

0

आप वर्तमान गतिविधि शुरू करने वाली गतिविधि प्राप्त करने के लिए getCallingActivity () का उपयोग कर सकते हैं और अंत में प्रतिक्रिया कोड के साथ परिणाम मान प्राप्त करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.