android - परमाणुता को निष्क्रियता में बुलाया नहीं जा रहा है




android-fragments android-activity (20)

एक बिंदु कोई भी mention नहीं करता है कि सुनिश्चित करें कि आपका होस्ट गतिविधि लॉन्च मोड singleInstance या singleTask singleInstance सेट नहीं होना चाहिए।

यदि आपका लॉन्च मोड सिंगल इंस्टेंस या सिंगल टास्क पर सेट किया गया है तो एक्टिविटी रिसेट काम नहीं करेगा। या आप इन IntentFilters का उपयोग कर अपनी गतिविधि को बुलाओ

standard या singleTop लॉन्च मोड ठीक काम करेगा।

इस खंड को होस्ट करने वाली गतिविधि में onActivityResult जिसे कैमरा गतिविधि वापस आती है।

मेरा टुकड़ा एक तस्वीर लेने के लिए कैमरे के लिए भेजे गए इरादे के परिणामस्वरूप एक गतिविधि शुरू करता है। चित्र एप्लिकेशन ठीक लोड करता है, एक तस्वीर लेता है, और रिटर्न। हालांकि onActivityResult हालांकि कभी हिट नहीं है। मैंने ब्रेकपॉइंट्स सेट कर दिए हैं, लेकिन कुछ भी ट्रिगर नहीं हुआ है। क्या एक टुकड़ा onActivityResult पर हो onActivityResult ? मुझे ऐसा लगता है क्योंकि यह एक प्रदान किया गया कार्य है। यह क्यों नहीं चल रहा है?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

नेस्टेड फ्रेजमेंट्स के लिए (उदाहरण के लिए, व्यूपेजर का उपयोग करते समय)

आपकी मुख्य गतिविधि में:

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

आपके मुख्य शीर्ष स्तर के टुकड़े (ViewPager खंड) में:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

आपके फ्रेगमेंट (नेस्टेड टुकड़े) में:

public void yourMethod(Intent data){
    // Do whatever you want with your data
}

अगर कोई अभी भी इसे नहीं बना सकता तो मैं दो सलाह जोड़ सकता हूं। Manifest.xml फ़ाइल में, सुनिश्चित करें कि होस्टिंग गतिविधि समाप्त नहीं हुई है जब कॉल वापस किया गया है और गतिविधि शुरू करने के लिए लॉन्च मोड मानक के रूप में है। नीचे के रूप में विवरण देखें:

होस्टिंग गतिविधि के लिए, यदि कोई इतिहास संपत्ति गलत है तो सेट करें

android:noHistory="false"

गतिविधि शुरू करने के लिए, लॉन्च मोड को मानक के रूप में सेट करें यदि आपके पास है

android:launchMode="standard"

अपने टुकड़े के अंदर, कॉल करें

this.startActivityForResult(intent, REQUEST_CODE);

जहां this टुकड़े का जिक्र कर रहा है। अन्यथा @Clevester के रूप में करते हैं कहा:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

मुझे भी फोन करना पड़ा

super.onActivityResult(requestCode, resultCode, data);

पेरेंट गतिविधि में onActivityResult में इसे काम करने के लिए।

(मैंने इस उत्तर को @ सेलेस्टर के उत्तर से अनुकूलित किया।)


एक बार जब मैंने कोड के इस ब्लॉक को एक यूटिलिटी क्लास के बाहर कोड के ब्लॉक को स्थानांतरित कर दिया, तो मुझे भी एक ही समस्या का सामना करना पड़ा, parentActivity साथ तर्क के रूप में पारित किया गया,

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

तब मुझे उस फ्रैगमेंट की onActivityResult विधि पर कोई मूल्य नहीं onActivityResult , बाद में, मैंने तर्क को फ्रैगमेंट में बदल दिया, इसलिए विधि की संशोधित परिभाषा की तरह लग रहा था,

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

उसके बाद, मैं onActivityResult पर onActivityResult पर मूल्य प्राप्त करने में सक्षम था


कई नेस्टेड फ्रेजमेंट्स के लिए (उदाहरण के लिए, जब एक खंड में व्यूपेगर का उपयोग करते हैं)

आपकी मुख्य गतिविधि में :

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

आपके टुकड़े में:

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

अपने घोंसले टुकड़े में

कॉल गतिविधि

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

अद्वितीयInstanceInt - किसी अन्य खंड को उत्तर देने के लिए नेस्टेड टुकड़ों के बीच अद्वितीय है जो एक int के साथ इसे प्रतिस्थापित करें।

प्रतिक्रिया प्राप्त करें

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

ध्यान

0 और 65536 के बीच की संख्या अद्वितीयInstanceInt में त्रुटि के लिए उपयोग की आवश्यकता है "केवल अनुरोध कोड के लिए कम 16 बिट्स का उपयोग कर सकते हैं" से बचें।


बस टुकड़े के लिए नीचे कोड का उपयोग करें।

@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {

    if (index == 1)
    {
        Intent intent = new Intent(Intent.ACTION_PICK,
                                   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent,
                                                    "Select Picture"), 1);
     }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            //selectedImagePath = getPath(selectedImageUri);
        }
    }
}

onActivityResult अपने माता-पिता को फोन किए बिना कॉल करेगा।


मुझे ChildFragmentManager साथ एक ही समस्या है। प्रबंधक परिणाम को नेस्टेड खंड में पास नहीं करेगा, आपको इसे अपने मूल टुकड़े में मैन्युअल रूप से करना होगा।

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

मुझे लगता है कि आप getActivity().startActivityForResult(intent,111); । आपको startActivityForResult(intent,111); कॉल करना चाहिए startActivityForResult(intent,111);


मेरी समस्या मेजबान गतिविधि के साथ थी, मैंने इसे एक सेट android:launchMode="standard" साथ पाया android:launchMode="standard" मैंने इसे अस्थायी रूप से हटा दिया है!


मैं इस समस्या को एक टुकड़े में भी मिला। और मैंने एक DialogFragment में DialogFragment बुलाया।

लेकिन अब यह समस्या हल हो गई है:
FragmentClassname.this.startActivityForResult


मैं सिर्फ एक कामकाज विधि बनाते हैं:

public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(_tempFragment != null)
        _tempFragment.onActivityResult(requestCode, resultCode, data);
}

शुरूआत से पहले, अपने Fragment में, सक्रियताResult, सेट करें

MainActivity._tempFragment = this;

AtctivityResult <- Fragment में के बाद

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

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}

यदि आप नेस्टेड टुकड़ों का उपयोग कर रहे हैं, तो यह भी काम कर रहा है:

getParentFragment().startActivityForResult(intent, RequestCode);

इसके अतिरिक्त, आपको पेरेंट गतिविधि से super.onActivityResult को कॉल करना होगा और खंड की onActivityResult विधि भरें।


यदि उपरोक्त समस्या का सामना फेसबुक लॉगिन पर किया जाता है तो आप नीचे दिए गए कोड को अपने टुकड़े की मूल गतिविधि में उपयोग कर सकते हैं जैसे:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

या:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

और अपने टुकड़े में नीचे कॉल जोड़ें ...

callbackManager.onActivityResult(requestCode, resultCode, data);

यह सबसे लोकप्रिय मुद्दा है। हम इस मुद्दे के बारे में बहुत सारे धागे पा सकते हैं। लेकिन उनमें से कोई भी मेरे लिए उपयोगी नहीं है।

इसलिए मैंने इस समाधान का उपयोग करके इस समस्या को हल किया है।

आइए पहले समझें कि यह क्यों हो रहा है।

हम सीधे फ्रैगमेंट से startActivityForResult को कॉल कर सकते हैं लेकिन वास्तव में मैकेनिक पीछे सभी को गतिविधि द्वारा नियंत्रित किया जाता है।

एक बार जब आप एक फ्रैगमेंट से startActivityForResult को कॉल करते हैं, तो अनुरोध कोड को कोड में फ्रैगमेंट की पहचान संलग्न करने के लिए बदला जाएगा। इससे गतिविधि को ट्रैक करने में सक्षम हो जाएगा कि एक बार परिणाम प्राप्त होने पर यह अनुरोध कौन भेजता है।

एक बार गतिविधि को वापस नेविगेट कर दिया गया था, परिणाम संशोधित अनुरोध कोड के साथ गतिविधि के ऑनएक्टिविटी रिसेट पर भेजा जाएगा जिसे मूल अनुरोध कोड + फ्रैगमेंट की पहचान के लिए डीकोड किया जाएगा। उसके बाद, गतिविधि उस प्रक्रिया में गतिविधि परिणाम को सक्रियता के माध्यम से भेज देगा। और यह सब किया गया है।

यह समस्या है:

गतिविधि परिणाम को केवल उस टुकड़े को भेज सकती है जो सीधे गतिविधि से जुड़ा हुआ है लेकिन घोंसला वाला नहीं है। यही कारण है कि सक्रियता पर नेस्टेड खंड के परिणाम को कभी भी कोई फर्क नहीं पड़ता।

उपाय:

1) नीचे दिए गए कोड से अपने टुकड़े में इरादा शुरू करें:

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2) अब आपके अभिभावक गतिविधि में ** onActivityResult() : ** पर ओवरराइड करें

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

इसे काम करने के लिए आपको इसे मूल गतिविधि में कॉल करना होगा।

3) अपने टुकड़े कॉल में:

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

       }
}

बस। इस समाधान के साथ, इसे किसी एकल टुकड़े के लिए लागू किया जा सकता है चाहे वह घोंसला हो या नहीं। और हाँ, यह सभी मामलों को भी शामिल करता है! इसके अलावा, कोड भी अच्छे और साफ हैं।


संक्षेप में,

खंड में, Fragment fragment = this घोषणा Fragment fragment = this ;

उसके बाद fragment.startActivityForResult उपयोग करें fragment.startActivityForResult

परिणाम गतिविधि में वापस आ जाएगा परिणाम।


समाधान 1:

कॉल startActivityForResult(intent, REQUEST_CODE); करें startActivityForResult(intent, REQUEST_CODE); getActivity().startActivityForResult(intent, REQUEST_CODE); की बजाय getActivity().startActivityForResult(intent, REQUEST_CODE);

समाधान 2:

जब startActivityForResult(intent, REQUEST_CODE); एक्टिविटी onActivityResult(requestCode,resultcode,intent) पर गतिविधि को बुलाया जाता है, और फिर आप fragments onActivityResult() requestCode, resultCode and intent पारित करते हुए यहां से fragments onActivityResult() कॉल कर सकते हैं।


होस्टिंग गतिविधि onActivityResult() ओवरराइड onActivityResult() , लेकिन यह onActivityResult() परिणाम कोड के लिए super.onActivityResult() को कॉल नहीं करता है। जाहिर है, भले ही खंड एक प्रारंभिकता startActivityForResult() कॉल कर रहा है, गतिविधि को परिणाम संभालने पर पहला शॉट मिलता है। जब आप टुकड़ों की मॉड्यूलरिटी पर विचार करते हैं तो यह समझ में आता है। एक बार जब मैंने सभी unhandled परिणामों के लिए super.onActivityResult() लागू किया, तो टुकड़े को परिणाम संभालने पर एक शॉट मिला।

और @siqing उत्तर से भी:

अपने टुकड़े में परिणाम प्राप्त करने के लिए सुनिश्चित करें कि आप startActivityForResult(intent,111); कॉल करें startActivityForResult(intent,111); प्राप्त करने के बजाय getActivity().startActivityForResult(intent,111); अपने टुकड़े के अंदर।


आपके कोड में घोंसला वाला टुकड़ा है। Super.onActivityForResult कॉलिंग काम नहीं करता है

आप प्रत्येक गतिविधि को संशोधित नहीं करना चाहते हैं जिसे आपके टुकड़े से बुलाया जा सकता है और टुकड़ा श्रृंखला में प्रत्येक टुकड़े को कॉल करने के लिए एक काम कर सकते हैं।

यहां कई कामकाजी समाधानों में से एक है। फ्लाई पर एक टुकड़ा बनाएं और सीधे समर्थन खंड प्रबंधक के साथ गतिविधि के लिए तार। फिर नव निर्मित खंड से startActivityForResult को कॉल करें।

private void get_UserEmail() {

    if (view == null) {
        return;
    }
    ((TextView) view.findViewById(R.id.tvApplicationUserName))
            .setText("Searching device for user accounts...");

    final FragmentManager fragManager = getActivity().getSupportFragmentManager();

    Fragment f = new Fragment() {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode,
                                     Intent data) {
            if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                String mEmail = "";
                if (resultCode == Activity.RESULT_OK) {
                    if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
                        mEmail = data
                                .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    }
                }
                if (mActivity != null) {
                    GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
                }
                doUser();
            }
            super.onActivityResult(requestCode, resultCode, data);
            fragManager.beginTransaction().remove(this).commit();
        }
    };
    FragmentTransaction fragmentTransaction = fragManager
            .beginTransaction();
    fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
    fragmentTransaction.commit();
}

विकल्प 1:

यदि आप खंड से getActivity().startActivityForResult() को कॉल कर रहे हैं तो आपको getActivity().startActivityForResult() को कॉल करना चाहिए, getActivity().startActivityForResult() नहीं। getActivity().startActivityForResult() , क्योंकि इसके परिणामस्वरूप एक्टिविटी रिसैट () पर खंड होगा।

यदि आप सुनिश्चित नहीं हैं कि आप startActivityForResult() पर कॉल कर रहे हैं और आप विधियों को कैसे कॉल करेंगे।

विकल्प 2:

चूंकि गतिविधि को एक्टिविटी onActivityResult() परिणाम प्राप्त onActivityResult() , इसलिए आपको गतिविधि के onActivityResult() पर ओवरराइड करना होगा और onActivityResult() परिणाम कोड या सभी के लिए संबंधित खंड में प्रचार करने के लिए super.onActivityResult() को कॉल करना होगा।

यदि उपरोक्त दो विकल्प काम नहीं करते हैं, तो विकल्प 3 देखें क्योंकि यह निश्चित रूप से काम करेगा।

विकल्प 3:

खंडन से ऑन एक्टिविटी रिसेट फ़ंक्शन तक एक स्पष्ट कॉल निम्नानुसार है।

अभिभावक गतिविधि वर्ग में ,ActivityResult () विधि को ओवरराइड करें और यहां तक ​​कि फ्रैगमेंट क्लास में इसे ओवरराइड करें और निम्न कोड के रूप में कॉल करें।

अभिभावक वर्ग में:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

बाल वर्ग में:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}




android-activity