StartActivityForResult () फ्रैगमेंट और फ़िनिश चाइल्ड एक्टिविटी से, onActivityResult () फ्रैगमेंट में कॉल नहीं करता है


172

FirstActivity.Javaएक FragmentA.Javaजो कॉल startActivityForResult()SecondActivity.Javaकॉल करें finish()लेकिन onActivityResultकभी भी कॉल न करें जो कि लिखा गया है FragmentA.Java

FragmentA.Java कोड:

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // some code
    Intent i = new Intent(getActivity(), SecondActivity.class);
    i.putExtra("helloString", helloString);
    getActivity().startActivityForResult(i, 1);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getActivity();
    if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
       //some code
    }
  }

SecondActivity.Java कोड:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       //some code
       Intent returnIntent = new Intent();
       returnIntent.putExtra("result", result);                          

       setResult(Activity.RESULT_OK,returnIntent);     
       finish();
  }

मैंने कोड को डिबग करने की कोशिश की है, लेकिन onAcitvityResult()कभी भी कॉल नहीं किया गया।


1
फर्स्टएक्विटी क्लास में इसे (onActivityResult मेथड) डालने की कोशिश करें
viplezer

जवाबों:


271

आपको onActivityResult()अपने FirstActivity.Javaअनुसार इस प्रकार लिखना होगा

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

तो यह आपके टुकड़े को बुलाएगा onActivityResult()

संपादित करें: समाधान के getActivity().startActivityForResult(i, 1);साथ बदलना हैstartActivityForResult(i, 1);


4
धन्यवाद @ केविन, मैंने कोशिश की कि आपने क्या कहा लेकिन यह काम नहीं कर रहा है। लेकिन मैं कोड डिबग, मैं देख onActivityresult()के FirstAcivity.Javaकहा जाता हो जाता है और onActivityresult()की FragmentA.Javaकभी नहीं कहा जाता है मिलता है। कृपया मदद कीजिए।
श्री रोशन पवार

52
कृपया getActivity () को बदलें। startActivityForResult (i, 1); startActivityForResult (i, 1) के साथ;
केविन अडेसरा

14
क्या ऐसा हो सकता है कि स्वीकृत समाधान में उत्तर वास्तव में वही है जो यहां गलत है, और वास्तविक समाधान केवल startActivityForResultइसके बजाय उपयोग करना है getActivity().start...? क्योंकि जहां तक ​​मैं देख सकता हूं, आप onActivityResultगतिविधि में अपनी परिभाषा के साथ अपनी परिभाषा को ओवरराइड कर रहे हैं (यानी यह बिल्कुल वैसा ही व्यवहार करता है जैसे कि उत्तर में ओवरराइड मौजूद नहीं था)।
अमन

@asQuirreL हाँ। शायद यही कारण है।
एंड्रॉयड डेवलपर

1
जैसा आप समझाते हैं मैं वैसा ही करता हूं, दोनों में सुपर के साथ onActivityResult () गतिविधि में भी ओवरराइड करते हैं और startActivityForResult (इरादा, i) बनाते हैं, लेकिन काम नहीं किया, मुझे मदद की ज़रूरत है
अमल क्रोनज़

33

केविन का जवाब काम करता है लेकिन उस समाधान का उपयोग करके डेटा के साथ खेलना मुश्किल हो जाता है।

startActivityForResult()गतिविधि स्तर पर सर्वश्रेष्ठ समाधान शुरू नहीं होता है।

आपके मामले में कॉल नहीं है getActivity().startActivityForResult(i, 1);

इसके बजाय, बस उपयोग करें startActivityForResult()और यह पूरी तरह से ठीक काम करेगा! :)


27

आपको अपने FirstActivity.Java में onActivityResult () लिखना होगा

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

यह FirstActivity.java पर टुकड़ों के onActivityResult विधि को ट्रिगर करेगा


2
धन्यवाद दोस्त ! लेकिन इसके लिए एक स्तर 26 एपीआई की आवश्यकता होती है .. इसलिए मेरे मामले में मैंने getSupportFragmentManager () का उपयोग किया। FindFragmentByTag विधि, लेकिन आपके विचार से
Dagnogo Jean-François

15

टुकड़ा पहले से ही है startActivityForResult, जो onActivityResultटुकड़े में कॉल करेगा यदि आप इसका उपयोग करते हैं, तो इसके बजाय getActivity()...


7

सबसे महत्वपूर्ण बात, यह सब यहाँ याद आ रही है ... FirstActivity का लॉन्चमोड सिंगलटॉप होना चाहिए। यदि यह एकलता है, तो FrAmentA में onActivityResult को केवल StartActivityForResult विधि कहने के बाद कहा जाएगा। इसलिए, यह सेकंडएक्टिविटी में फिनिश () पद्धति के कॉल का इंतजार नहीं करेगा।

तो निम्न चरणों से गुजरें, यह निश्चित रूप से काम करेगा क्योंकि इसने मेरे लिए लंबे शोध के बाद भी काम किया है।

AndroidManifest.xml फ़ाइल में, लॉन्च करें। FirstActivity.Java को सिंगलटॉप के रूप में लॉन्च करें।

<activity
        android:name=".FirstActivity"
        android:label="@string/title_activity_main"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" />

FirstActivity.java में, onActivityResult विधि को ओवरराइड करें। जैसा कि यह FragmentA के onActivityResult को बुलाएगा।

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

FragmentA.Java में, onActivityResult विधि को ओवरराइड करें

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("FragmentA.java","onActivityResult called");
}

startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);FragmentA.Java से कॉल करें

finish();SecondActivity.java में कॉल विधि

उम्मीद है कि यह काम करेगा।


यह सबसे अच्छा जवाब है। मैनिफेस्ट में "लॉन्चमोड" को परिभाषित करने का विस्तार महत्वपूर्ण है।
पाब्लो इनुसा

5

हम startActivityForResult()सीधे Fragment से कॉल कर सकते हैं इसलिए आपको this.startActivityForResult(i, 1);इसके बजाय कॉल करना चाहिएgetActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

गतिविधि आपके फ्रैगमेंट में गतिविधि परिणाम भेज देगी।


1

जवाब के लिए देर हो सकती है। लेकिन किसी के लिए भी मददगार होगा।

मेरे मामले में फ्रैगमेंट से गतिविधि को कॉल करना चाहते हैं और टुकड़े से वापस सेट करें।

मैंने Fragment Like की getContext का उपयोग किया है।

startActivityForResult(new Intent(getContext(), NextActivity.class), 111);

और Fragment से Result सेट करें

getActivity().setResult(Activity.RESULT_OK);
                    getActivity().finish();

अब परिणाम के साथ फ्रैगमेंट के लिए हो रही है

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == 111) {

    }
}

0

onActivityResult () की MAinActivity कॉल करेगी, onActivityResult () फ्रोजन वॉन्ट कॉल की, क्योंकि टुकड़ा गतिविधि में रखा गया है, तो जाहिर है यह MainActivity के लिए वापस आ गया



-6

अपने onActivityresult()माता-पिता को बुलाओ ।


उत्तर @URAndroid के लिए धन्यवाद, लेकिन समाधान मिल गया। आपका समाधान सही नहीं है। यह अच्छी प्रोग्रामिंग नहीं है।
श्री रोशन पवार

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