TabHost एक्टिविटी से परिणाम (startActivityForResult) कैसे लौटाएं?


275

मेरे पास मेरे उदाहरण में 3 कक्षाएं हैं: कक्षा ए, मुख्य गतिविधि। क्लास ए ने एक कॉल शुरू की

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

क्लास बी, यह क्लास एक टैबिलिटी है:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

कक्षा सी, यह कक्षा एक नियमित गतिविधि है:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult को कक्षा A में कहा जाता है, लेकिन RESULT_CANCELEDइसके बजाय परिणामी है RESULT_OKऔर लौटा हुआ इरादा शून्य है। मैं TabHost के अंदर गतिविधि से कुछ कैसे वापस करूँ?

मुझे पता है कि समस्या यह है कि मेरा क्लास सी वास्तव में क्लास बी के अंदर चल रहा है, और क्लास बी वही है जो RESULT_CANCELEDक्लास ए में वापस आ रहा है। मुझे अभी कोई काम नहीं पता है।

जवाबों:


366

हे भगवान! कई घंटे बिताने और Android स्रोतों को डाउनलोड करने के बाद, मैं आखिरकार एक समाधान के लिए आया हूं।

यदि आप गतिविधि वर्ग को देखते हैं, तो आप देखेंगे, यह finish()विधि केवल परिणाम वापस भेजती है यदि कोई mParentसंपत्ति सेट है null। अन्यथा परिणाम खो जाता है।

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

तो मेरा समाधान मूल गतिविधि के लिए परिणाम सेट करना है यदि मौजूद है, जैसे:

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

मुझे उम्मीद है कि अगर कोई इस समस्या को फिर से हल करने के लिए देखता है तो यह उपयोगी होगा।


1
मैंने यहां एक हैकी समाधान पोस्ट किया है, इसकी सरल और इसमें बिना किसी सामग्री के साथ एक पारदर्शी गतिविधि शामिल है - यह सामान्य जीवन चक्र कार्य करता है और सब कुछ आसान बनाता है। stackoverflow.com/questions/7812120/…
CQM

वह तो कमाल है! धन्यवाद धन्यवाद धन्यवाद! यह पूरी तरह से और बहुत कम उपद्रव के साथ काम करता है। मैंने इस छोटी सी मणि के साथ अपने सभी क्रियाकलापों के लिए नियमित सेटअनॉल्ट () विधियों को ओवरराइड किया है। धन्यवाद!
स्कॉट बिग्स

मैंने आपके समाधान का उपयोग किया, फिर भी मेरा कोड वापस आने पर onactivityresult विधि को नहीं पकड़ रहा है। कृपया मेरी मदद करें .. क्या मुझे किसी और चीज का उपयोग करने की आवश्यकता है?
6

11
एपीआई गाइड में कहीं भी प्रलेखित नहीं की गई गतिविधि में परिणाम क्यों लौट रहा है, मुझे अजीब लगा।
एलेक्स।

अरे नहीं! अच्छी नौकरी, इलिया! धन्यवाद
Sirelon

64

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

"Param_result" के लिए एक मामूली संशोधन के साथ

/* Start Activity */
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
    startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case 90:
        if (resultCode == RESULT_OK) {
            Bundle res = data.getExtras();
            String result = res.getString("param_result");
            Log.d("FIRST", "result:"+result);
        }
        break;
    }
}

private void finishWithResult()
{
    Bundle conData = new Bundle();
    conData.putString("param_result", "Thanks Thanks");
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(RESULT_OK, intent);
    finish();
}

2
सरल, setResultमुख्य बात थी। इसे किसी चीज़ पर सेट करें, या उदाहरण के लिए एक मूल्य RESULT_OKऔर आप जाने के लिए अच्छा है; setResult(RESULT_OK);। मेरी मदद की, +1
अफजल अहमद जीशान ने

16

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

यदि सेट और इस आशय का उपयोग किसी मौजूदा गतिविधि से नई गतिविधि लॉन्च करने के लिए किया जा रहा है, तो मौजूदा गतिविधि के उत्तर लक्ष्य को नई गतिविधि में स्थानांतरित कर दिया जाएगा।


1

आप कक्षा B में एक onActivityResult भी लागू कर सकते हैं और startActivityForResult का उपयोग करके कक्षा C लॉन्च कर सकते हैं। एक बार जब आप कक्षा बी में परिणाम प्राप्त करते हैं तो कक्षा सी के परिणाम के आधार पर वहां (कक्षा ए के लिए) परिणाम सेट करें। मैंने इसे बाहर करने की कोशिश नहीं की है लेकिन मुझे लगता है कि यह काम करना चाहिए।

एक और बात यह देखने के लिए है कि गतिविधि ए को एक एकल गतिविधि नहीं होना चाहिए। StartActivityForResult के लिए अपनी कक्षा B को काम करने के लिए गतिविधि A के लिए एक उप गतिविधि होना आवश्यक है और यह एक उदाहरण गतिविधि में संभव नहीं है, नई गतिविधि (Class B) एक नए कार्य में शुरू होती है।


1
चूँकि Class B एक TabActivity है और Class C उस गतिविधि में एक Tab है जो आप कक्षा B. में शुरू नहीं कर सकते हैं।
कैमरन मैक्ब्राइड

-1

गतिविधि 1 से गतिविधि 2 शुरू करें और परिणाम प्राप्त करें, आप startActivityForResult का उपयोग कर सकते हैं और गतिविधि 1 में onActivityResult को लागू कर सकते हैं और गतिविधि 2 में setResult का उपयोग कर सकते हैं।

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.