जब बटन दबाया जाता है तो setResult काम नहीं करता है


111

मैं सेट करने की कोशिश कर रहा हूँ। BACK बटन दबाने के बाद। मैं onDestroy में कॉल करता हूं

Intent data = new Intent();
setResult(RESULT_OK, data) 

लेकिन जब आता है

onActivityResult(int requestCode, int resultCode, Intent data) 

परिणामकोड 0 (RESULT_CANCELED) है और डेटा 'शून्य' है।

तो, मैं BACK बटन द्वारा समाप्त की गई गतिविधि से परिणाम कैसे पारित कर सकता हूं?

जवाबों:


159

आपको सुपरक्लास को कॉल करने से पहलेonBackPressed() विधि को पार करना होगा और परिणाम सेट करना होगा , अर्थात

@Override
public void onBackPressed() {
    Bundle bundle = new Bundle();
    bundle.putString(FIELD_A, mA.getText().toString());
    
    Intent mIntent = new Intent();
    mIntent.putExtras(bundle);
    setResult(RESULT_OK, mIntent);
    super.onBackPressed();
}

23
कृपया ध्यान दें कि यदि आप इस दृष्टिकोण का उपयोग करते हैं तो super.onBackPressed () मंगलाचरण को कॉल करने के बाद होना चाहिए। इसे पहले दिखाया गया है या आपको फिर से मूल समस्या होगी!
जेन्गेल्मा

1
यहाँ सबसे अच्छा जवाब है। अगर हम onPause () या onDestroy (), onBackPressed () को पहले ही ओवरराइड कर लेंगे और इसका परिणाम 0 पर सेट हो जाएगा। कृपया इसके बारे में जान लें!
मारेक

या आप onCreate में डिफ़ॉल्ट परिणाम सेट कर सकते हैं। खत्म होने से पहले कोई भी जगह () ठीक है।
हेलिन वांग सेप

5
मैंने समान दृष्टिकोण लागू किया लेकिन यह अभी भी काम नहीं कर रहा है। उदाहरण के लिए मेरे पास अनुरोध कोड है और इरादा काम कर रहा है, लेकिन परिणाम हमेशा 0 है।
नियॉन वेज

68

Activityकॉल करने से पहले परिणाम सेट करना होगा finish()। BACK पर क्लिक करने से वास्तव finish()में आपके द्वारा कॉल किया जाता हैactivity आप , इसलिए आप निम्न स्निपेट का उपयोग कर सकते हैं:

@Override
public void finish() {
    Intent data = new Intent();
    setResult(RESULT_OK, data); 

    super.finish();
}

यदि आप में कॉल करते NavUtils.navigateUpFromSameTask();हैं onOptionsItemSelected(), तो कॉल किया finish()जाता है, लेकिन आपको गलत मिलेगा result code। तो अगर आप कॉल करनी होगी finish()नहीं navigateUpFromSameTaskमें onOptionsItemSelected()onActivityResult में गलत अनुरोधकोड


यह ओपी मामले में काम करता है, लेकिन सामान्य रूप से नहीं, है ना? खत्म () से अधिक विधियाँ हैं जो ऐप जीवनचक्र (onPause () और onDestroy ()) के अंत को प्रेरित करती हैं? अन्य उत्तर पर मेरी टिप्पणी भी देखें।
pjv

और यहां तक ​​कि अगर वहाँ नहीं थे, तो आपको इसके बारे में तब नहीं पता होगा जब इसे एपीआई अपडेट में पेश किया जाएगा। जब आप ऑनपॉज़ () या ऑनडेस्ट्रॉय () के व्यवहार में परिवर्तन करते हैं तो आसानी से आप के रूप में आसानी से नहीं। इन तरीकों में आप कर रहे हैं चाहिए ओवरराइड करने के लिए।
pjv

6
@pjv - मैं अपनी बात नहीं मिलता है, क्या finishसे कोई लेना देना नहीं है onPauseऔर onDestroy? वे पूरी तरह से संबंधित नहीं हैं सिवाय इसके कि finishसमाप्ति की प्रक्रिया शुरू होती है onPauseऔर जो इसका onDestroyहिस्सा हैं।
JBM

20

आप कुछ कस्टम सेट करना चाहते हैं RESULT_CODEमें onBackPressedआप पहले सेट करने की जरूरत है तो घटना resultऔर उसके बाद फोन super.onBackPressed()और आप एक ही प्राप्त होगा RESULT_CODEफोन करने वाले गतिविधि के दशक में onActivityResultविधि

    @Override
    public void onBackPressed()
    {
         setResult(SOME_INTEGER);
         super.onBackPressed();
    }

10

मैंने अपना कोड रद्द कर दिया। शुरू में मैंने कुछ डेटा तैयार किया और इसे (यह काम नहीं किया) के रूप activity resultमें सेट onDestroyकिया। अब मैं activityहर बार डेटा सेट करता हूं कि लौटाया जाने वाला डेटा अपडेट किया गया है, और इसमें कुछ भी नहीं है onDestroy


यह मेरे लिए काम नहीं करता है क्योंकि मेरा डेटा "ऑनपॉज" में अपडेट है
बोसोन जूल

यदि आपके कॉल करने के बाद आपकी गतिविधि फिर से हो जाती है setResult(), तो आपका डेटा खो जाएगा।
जेरेत मिलार्ड

3

आप को इस तरह से ओवरऑउट करना चाहिए।

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        final Intent mIntent = new Intent();
        mIntent.putExtra("param", "value");
        setResult(RESULT_OK, mIntent);
        finish();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

2

देखें onActivityResult (पूर्णांक, पूर्णांक, आशय) डॉक

समाधान परिणाम गतिविधि की जाँच करने के लिए है मान गतिविधि .ESULT_CENCELED । यदि हाँ, तो इसका मतलब है कि या तो BACK दबाया गया था या गतिविधि क्रैश हो गई थी। आशा है कि यह आप लोगों के लिए काम करता है, मेरे लिए काम करता है :)।


यह सटीक समाधान है .. आपको परिणाम कोड है .. कोई भी आपके अलावा अन्य परिणाम कोड में सेट नहीं कर सकता है। इसलिए, यदि परिणाम ठीक नहीं है, तो इसका मतलब या तो उसकी पीठ दबाया गया है या दुर्घटनाग्रस्त हुआ है ..
जॉन

0

onDestroyश्रृंखला में बहुत देर हो चुकी है - इसके बजाय ओवरराइड करें onPauseऔर जांचें isFinishing()कि क्या आपकी गतिविधि अपने जीवनचक्र के अंत में है।


1
नहीं, यह बहुत देर हो चुकी है।
अलेक्सा 2k8

मैं वास्तव में इसे बग कहता हूं: code.google.com/p/android/issues/detail?id=1671 । जटिल अनुप्रयोगों में मुझे लगता है कि इसके कारण कुछ व्यवहार है जो आप प्रोग्राम नहीं कर सकते हैं।
pjv

यह भी बहुत उल्टा है। इतना है कि मैं पहले से ही 2 साल की अवधि में एक ही गलती कर रहा हूं।
pjv

असल में - यह और भी बुरा है। और यह जेबी में मौजूद है क्योंकि मैं कोडिंग कर रहा हूं। अगर मैं onPause से setResult को कॉल करता हूं, तो इसे निष्पादित किया जाता है, लेकिन परिणाम को रद्द करें और न ही डेटा सेट किया जाता है जब onActivityReturn निष्पादित होता है। क्यों?
Bostone

और इसलिए: "इस विधि (onPause) का क्रियान्वयन बहुत जल्दी क्योंकि अगले गतिविधि फिर से शुरू नहीं की जाएगी होना चाहिए जब तक इस विधि रिटर्न" goo.gl/8S2Y
Bostone

0

OnBackPressed (एंड्रॉइड लेवल 5 अप से) पर ओवरराइड करने की कोशिश करें, या onKeyDown () को ओवरराइड करें और KeyEvent.BUTTON_BACK को पकड़ें ( Android एक्टिविटी रिजल्ट देखें ) यह मेरे लिए ट्रिक है।


0

जब आप प्रारंभिक एक पर लौटते हैं, तो किसी भी गतिविधि के चालू होने में किसी भी तर्क पर भरोसा न करें। डॉक्स के अनुसार:

इस पद्धति का कार्यान्वयन (चालू) बहुत जल्दी होना चाहिए क्योंकि इस गतिविधि के वापस आने तक अगली गतिविधि फिर से शुरू नहीं की जाएगी

देखें http://goo.gl/8S2Y जानकारी के लिए।

प्रत्येक परिणाम में परिवर्तन पूर्ण होने के बाद परिणाम निर्धारित करने का सबसे सुरक्षित तरीका है (जैसा कि आप अपने उत्तर में उल्लेख करते हैं)


0

मैं जवाब देता हूं कि यह जवाब अन्य लोगों के लिए उपयोगी होगा: जब एक सेट launcheMode Android के साथ: launchMode = "singleTask" मैं भी परिणाम प्राप्त नहीं कर सकता, डॉक्टर कहते हैं:

     /* <p>Note that this method should only be used with Intent protocols
 * that are defined to return a result.  In other protocols (such as
 * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
 * not get the result when you expect.  For example, if the activity you
 * are launching uses the singleTask launch mode, it will not run in your
 * task and thus you will immediately receive a cancel result.
 */

तथा:

     /* <p>As a special case, if you call startActivityForResult() with a requestCode 
 * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
 * activity, then your window will not be displayed until a result is 
 * returned back from the started activity.  This is to avoid visible 
 * flickering when redirecting to another activity. 
 */
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.