onActivityResult খণ্ডে কল করা হচ্ছে না


876

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);
    }
}

2
এই পোস্টটি দেখুন, সমস্যার বিবরণ এবং সাধারণ কাজের সমাধান রয়েছে: স্ট্যাকওভারফ্লো
ওলেক্সি কে।

5
অন্য যে কেউ এটি পড়ে নিশ্চিত হন যে আপনি পাস করেছেন requestCode >= 0!
মুহাম্মদ বাবর

3
এছাড়াও নিশ্চিত করুন যে আপনার ক্রিয়াকলাপ লাকমোড অবশ্যই সিঙ্গলআইনস্ট্যান্স বা সিঙ্গেল টাস্ক নয়। অন্যথায়অ্যাক্টিভিটি রেজাল্ট কল করা হবে না
জাওয়াদ জেব

দেখুন এই লিঙ্কটি আপনাকে সহায়তা করতে পারে: androidtutorialonline.com/onactivityresult-in-fraament
অ্যান্ড্রয়েড টিউটোরিয়াল

আমাদের ক্রিয়াকলাপের ক্রিয়াকলাপের ক্রিয়াকলাপের অনিয়ন্ত্রিত ফলাফলকে খণ্ডে পুনঃনির্দেশ করা দরকার। এই লিঙ্কটিটি দেখুন
অ্যান্ড্রয়েড

উত্তর:


1239

হোস্টিং ক্রিয়াকলাপটি ওভাররাইড করে onActivityResult(), তবে এটি super.onActivityResult()অযথিত ফলাফল কোডগুলির জন্য কোনও কল দেয় না । স্পষ্টতই, startActivityForResult()কলটি কল করার জন্য খণ্ডটি হওয়া সত্ত্বেও , ক্রিয়াকলাপটি হ্যান্ডেল করার সময় প্রথম শট পায়। আপনি টুকরাগুলির পরিমিতি বিবেচনা করার সময় এটি অর্থবোধ করে। আমি যখন super.onActivityResult()সমস্ত অপ্রচলিত ফলাফলের জন্য প্রয়োগ করলাম , ফলটি হ্যান্ডেল করার সময় খণ্ডটি শট পেল।

এবং @ সিকিংয়ের উত্তর থেকেও:

আপনার খণ্ডে ফলাফল পেতে আপনার খণ্ডের অভ্যন্তরের startActivityForResult(intent,111);পরিবর্তে কল করেছেন তা নিশ্চিত getActivity().startActivityForResult(intent,111);করুন।


34
আপনার ক্রিয়াকলাপের অ্যাক্টিভিটি রিসাল্টে, সুপার.অ্যাক্টিভিটিস রেজাল্ট ()
স্পিডি

167
@ স্টেআরমি নিশ্চিত করুন যে আপনি আপনার খণ্ড থেকে স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট () এবং getActivity () না। StartActivityForResult () কল করেছেন। নীচে বুদ্ধিমান উত্তর দেখুন।
OferR

8
এখানে কোনও সম্পর্কিত বাগ দেখা যায়, যেখানে সমর্থন লাইব্রেরি কোড জিওআল
অলি সি

82
এছাড়াও মনে রাখবেন যে আপনি যদি নেস্টেড টুকরা ব্যবহার করে থাকেন তবে শিশু getParentFragment().startActivityForResultখণ্ডটিকে কল করা উচিত যাতে পিতামণ্ডার খণ্ডটিকে তার onActivityResult পদ্ধতি বলা হয়।
এরিক ব্রায়নসোল্ড

7
@ এরিকব্রাইন্সভোল্ডটি ঠিক ছিল, স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট নেস্টেড টুকরাগুলিতে কাজ করে না। এর জন্য, আপনি আরও ভালভাবে পিতৃপরিচয় () শুরু করতে পারেন tivity onActivityResult (অনুরোধ কোড, ফলাফলকোড, ডেটা)
এড্রিয়ান

328

আমি মনে করি আপনি ফোন করেছেন getActivity().startActivityForResult(intent,111);। আপনার ফোন করা উচিত startActivityForResult(intent,111);


3
আমি একই RingtonePreferenceঅবস্থানে ছিল সঙ্গে অবস্থিত PreferenceFragment। দুর্ভাগ্যক্রমে, RingtonePreferenceকলগুলি getActivity().startActivityForResult()এবং আমি super.onActivityResultক্রিয়াকলাপে কল করেও ফলাফল পাইনি onActivityResult। আমি RingtonePreferenceক্লাস থেকে প্রাপ্ত একটি উত্স তৈরি করতে বাধ্য হয়েছিল , যা নিজেকে PreferenceFragmentকল এবং কলগুলির সাথে আবদ্ধ করে fragment.startActivityForResult()
স্ট্যান

@ সিকিংয়ের পরে আমি আমার স্থিতিশীল পদ্ধতি থেকে স্টার্টঅ্যাক্টিভিটফর্মসাল্ট কল করতে পারছি না। এর জন্য কোন সমাধান? আমার অবশ্যই কার্যকলাপ.স্টার্টএটিভিটি ফর রিসাল্ট ব্যবহার করা দরকার। দয়া করে আমাকে এতে সহায়তা করুন
শ্রেয়াশ মহাজন

269

বিকল্প 1:

আপনি যদি startActivityForResult()খণ্ডটি থেকে কল করছেন তবে আপনার কল করা উচিত startActivityForResult(), না getActivity().startActivityForResult(), কারণ এটি অ্যাক্টিভিটিআরসাল্ট () এর টুকরো হয়ে যাবে।

আপনি কোথায় কল করছেন startActivityForResult()এবং কীভাবে আপনি কল করার পদ্ধতিগুলি করবেন তা যদি আপনি নিশ্চিত না হন ।

বিকল্প 2:

যেহেতু ক্রিয়াকলাপের ফলাফল পাওয়া যায় onActivityResult(), তাই আপনাকে ক্রিয়াকলাপকে ওভাররাইড করতে হবে onActivityResult()এবং super.onActivityResult()আনহ্যান্ডেল রেজাল্ট কোড বা সকলের জন্য সংশ্লিষ্ট খণ্ডে প্রচার করতে কল করতে হবে।

উপরের দুটি বিকল্প যদি কাজ না করে তবে 3 বিকল্পটি দেখুন কারণ এটি অবশ্যই কাজ করবে।

বিকল্প 3:

অ্যাক্টিভিটিআরসাল্ট ফাংশনটিতে টুকরো থেকে স্পষ্ট কলটি নিম্নরূপ।

প্যারেন্ট অ্যাক্টিভিটি ক্লাসে, onActivityResult () পদ্ধতিটি ওভাররাইড করুন এবং এমনকি ফ্রেগমেন্ট ক্লাসে ওভাররাইড করুন এবং নীচের কোড হিসাবে কল করুন।

অভিভাবক শ্রেণিতে:

@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
}

4
এটি আমার পক্ষে কাজ করেছে। এটি একটি বাজে কাজ, তবে এই বোকা বাগটি সমাধান করার জন্য আমার কাছে এর চেয়ে ভাল ধারণা নেই ...
বোগদান জুড়াক

@ ভিভকি, আপনার উত্তর আমার পক্ষে কাজ করেছে। তবে আমি আর একটি সমস্যার মুখোমুখি হচ্ছি, এর পরিবর্তে setResult(); finish();যখন আমি দ্বিতীয় ক্রিয়াকলাপ থেকে ফিরে টিপতাম তখন onActivityResultসরবরাহের সাথেও ডেকে আনি RESULT_CODE
স্নেহাল_পেনুরকার

চমত্কার উত্তর। এটি করার জন্য আমি তৃতীয় সমাধানটি প্রয়োগ করেছি implemented
সাশ_কেপি

আমি মনে করি সমাধানটি 3 আমার পক্ষে কাজ করবে onActivityResult()তবে ক্রিয়াকলাপটি একটি অদ্ভুত প্রত্যাবর্তন করে requestCodeযা আমার খণ্ডে প্রেরণ করা হয় এবং তারপরে উপেক্ষা করা হয় = /
ই-কামি

1
@notGeek আপনি সঠিক আছেন আপনি খণ্ড বা ক্রিয়াকলাপ থেকে ডাকলেও ফলাফল সর্বদা ক্রিয়াকলাপে পুনরুদ্ধার করা হয়।
বিনয়াক

83

আপনি যদি আপনার ক্রিয়াকলাপের টুকরোগুলি জানেন না তবে কেবল সেগুলি সমস্ত গণনা করুন এবং ক্রিয়াকলাপের ফলাফল যুক্তি প্রেরণ করুন:

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

3
খারাপ, আমি ভেবেছিলাম আমি সবেমাত্র সহজ সমাধানটি খুঁজে পেয়েছি, তবে getFrations () এর মতো কোনও পদ্ধতি নেই।
উইন্ডারাইডার

2
পছন্দ করেছেন যদি আপনি অ্যান্ড্রয়েড সমর্থন লাইব্রেরি (অ্যাপকম্প্যাট) ব্যবহার করেন।
দাসার

2
এছাড়াও, আমি কঠোরভাবে শিখেছি যে আপনাকে যাচাই করতে হবে অ্যারেতে থাকা খণ্ডটি নিজেই কোনও রেফারেন্স নয় কিনা! `যদি (খণ্ড! = এটি) {ফ্রেগমেন্ট.অনঅ্যাক্টিভিটি রেজাল্ট (অনুরোধকোড, রেজাল্ট কোড, ডেটা); `
পুনরায় জহন

যদি টুকরোগুলি বাসা বেঁধে করা হয় তবে এটি কাজ করে না, কারণ শীর্ষস্থানীয় খণ্ডগুলি তালিকায় থাকবে। আমি বিশ্বাস করি যে সুপার.অ্যাক্টিভিটিস রিসাল্ট () ইতিমধ্যে তালিকার সমস্ত টুকরোটিতে অ্যাক্টিভিটিস রেজাল্ট () কে কল করছে, সুতরাং এই ধারণাটি অপ্রয়োজনীয়।
BeccaP


83

আমার সাথেও একই সমস্যা হচ্ছে 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);
    }
}

1
যদি আপনার ব্যক্তিগত সদস্য হিসাবে আপনার সন্তানের টুকরা থাকে তবে Fragment fragment = myChildFragment;উপরের findFragmentByTagকোডের লাইনটি প্রতিস্থাপন করতে ব্যবহার করুন । বাকিগুলি অপরিবর্তিত রাখা যেতে পারে।
lcn

7
আমার ধারণা আমি প্রাইভেট সদস্য হিসাবে কোনও খণ্ড রাখার বিরুদ্ধে দৃ strongly়ভাবে সুপারিশ করব would তাদের নিজস্ব জীবনচক্র রয়েছে তাই আপনি কখনই জানতে পারবেন না যে তাদের সাথে যদি কথাবার্তা ভালভাবে হয় তবে ম্যানেজার তা করেন। এছাড়াও তারা বেশ মোটা এবং আমি মেমরি ফুটো সম্পর্কে উদ্বিগ্ন। আপনার যদি এটির ব্যবহারের প্রয়োজন না হয় তবে পরিচালকটি তৈরি করা হত না।
মিনসম্যান

67

আসল পোস্ট।

FragmentActivityপরিবর্তিত requestCodeদ্বারা প্রতিস্থাপন । এর পর, যখন onActivityResult()প্রার্থনা করা হবে, FragmentActivityউচ্চতর 16 বিট parses এবং মূল অসম্পূর্ণ অংশ সূচী পুনরুদ্ধার। এই স্কিমটি দেখুন:

এখানে চিত্র বিবরণ লিখুন

মূল স্তরে কয়েকটি টুকরো থাকলে সমস্যা নেই। তবে যদি আপনার টুকরো টুকরো টুকরো টুকরো থাকে , উদাহরণস্বরূপ Fragmentভিতরে কয়েকটি ট্যাব সহ ViewPager, আপনি গ্যারান্টিযুক্ত একটি সমস্যার মুখোমুখি হবেন (বা ইতিমধ্যে এটি সম্মুখীন হয়েছিলেন))

কারণ কেবলমাত্র একটি সূচক ভিতরে সঞ্চিত থাকে requestCode। এটি এর Fragmentভিতরে সূচক FragmentManager। যখন আমরা নেস্টেড টুকরা ব্যবহার করি, সেখানে শিশুদের রয়েছে FragmentManager, যার নিজস্ব খণ্ডগুলির তালিকা রয়েছে। সুতরাং, মূল থেকে শুরু করে সূচকের পুরো শৃঙ্খলা সংরক্ষণ করা দরকার FragmentManager

এখানে চিত্র বিবরণ লিখুন

আমরা কীভাবে এই সমস্যাটি সমাধান করব? এই পোস্টে সাধারণ সমাধান সমাধান আছে

গিটহাব: https://github.com/shamanland/nested-fragment-issue


আমার একই সমস্যা আছে যেমন আমি প্যারেন্ট টুকরাতে ভিউপেজার ব্যবহার করেছি যা অন্য টুকরোটিকে ট্যাব হিসাবে ধারণ করে। নেস্টেড-টুকরা-ইস্যুটি ব্যবহার করে চেষ্টা করেছি তবে সংকলন এরোর সাথে শেষ হয়েছে। আপনি কি আমাকে সমাধানের পরামর্শ দিতে পারেন? Github.com/shamanland/nested-fragment-issue/issues/2
cgr


ধন্যবাদ! যদি এটি কোনও প্রস্তাবিত সমাধান না হয় তবে আমি সেই অনুসারে উত্তরটি সম্পাদনা করার পরামর্শ দিচ্ছি যাতে এটির সংকলন এরোস রয়েছে তা জানার জন্য কেউ চেষ্টা করে সময় ব্যয় করতে না পারে।
সিজিআর

44

এটি সবচেয়ে জনপ্রিয় সমস্যা। আমরা এই সমস্যাটি সম্পর্কিত প্রচুর থ্রেড পাই। তবে এগুলির কোনওটিই আমার পক্ষে কার্যকর নয়।

সুতরাং আমি এই সমাধানটি ব্যবহার করে এই সমস্যার সমাধান করেছি।

আসুন প্রথমে বুঝতে হবে কেন এটি হচ্ছে।

আমরা startActivityForResultসরাসরি খণ্ড থেকে কল করতে পারি তবে প্রকৃতপক্ষে মেকানিকগুলি সমস্ত ক্রিয়াকলাপ দ্বারা পরিচালিত হয়।

একবার আপনি যদি startActivityForResultকোনও খণ্ড থেকে কল করেন, কোডের সাথে ফ্রেগমেন্টের পরিচয় সংযুক্ত করতে অনুরোধকোড পরিবর্তন করা হবে। এর ফলে ক্রিয়াকলাপ ফলাফল অর্জনের পরে কে এই অনুরোধটি প্রেরণ করে তা আবার অনুসরণ করতে সক্ষম করবে।

ক্রিয়াকলাপটি আবার নেভিগেট হয়ে গেলে, ফলাফলটি পরিবর্তিত অনুরোধকোডের সাথে ক্রিয়াকলাপেরঅ্যাক্টিভিটিস রেজাল্টে প্রেরণ করা হবে যা আসল অনুরোধকোড + খণ্ডের সনাক্তকরণে ডিকোড করা হবে। এর পরে, ক্রিয়াকলাপ ক্রিয়াকলাপের ফলাফলটিকে onActivityResult এর মাধ্যমে সেই খণ্ডে প্রেরণ করবে। এবং এটি সব সম্পন্ন হয়েছে।

সমস্যা হল:

ক্রিয়াকলাপ ফলাফলটিকে কেবলমাত্র খণ্ডগুলিতে প্রেরণ করতে পারে যা সরাসরি ক্রিয়াকলাপের সাথে সংযুক্ত করা হয়েছে তবে নেস্টেডের সাথে নয়। এ কারণেই নেস্টেড টুকরোটির ক্রিয়াকলাপের ফলাফলটি যাই হোক না কেন বলা হবে না।

সমাধান:

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);
    }

এটি কাজ করতে আপনাকে পিতামাতার কার্যকলাপে এটি কল করতে হবে call

3) আপনার টুকরা কল:

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

       }
}

এটাই. এই সমাধানের সাহায্যে, এটি কোনও একক খণ্ডের জন্য বাসাযুক্ত কিনা তা প্রয়োগ করা যেতে পারে। এবং হ্যাঁ, এটি সমস্ত কেস জুড়ে! তদ্ব্যতীত, কোডগুলিও সুন্দর এবং পরিষ্কার clean


আমি 'ক্রিয়াকলাপ' এর সাথে সিস্টেমের অভিপ্রায়টির জন্য অনুরোধ করছিলাম আমাকে কেবল খণ্ড প্রসঙ্গে ব্যবহার করতে হবে।
উজায়ের

18

অনেক নিস্টেড ফ্রেগমেন্টসগুলির জন্য (উদাহরণস্বরূপ, কোনও খণ্ডে ভিউপ্যাজার ব্যবহার করার সময়)

আপনার মূল ক্রিয়াকলাপে :

@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);

অনন্যIsstanceInt - অন্য একটি খণ্ড উত্তরের চিকিত্সা রোধ করতে নেস্টেড টুকরাগুলির মধ্যে স্বতন্ত্র এমন কোনও int দিয়ে এটি প্রতিস্থাপন করুন।

সাড়া পাবেন

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

মনোযোগ

0 এবং 65536 এর মধ্যে একটি সংখ্যা অনন্যIsstanceInt ব্যবহার করতে হবে ত্রুটি এড়াতে "" শুধুমাত্র অনুরোধকোডের জন্য কম 16 বিট ব্যবহার করতে পারে "এড়াতে হবে।


ক্রিয়াকলাপে
ওলেকসান্ডার ফিরসভ

14

কেউ যদি এখনও এটি না করতে পারে তবে আমি দুটি পরামর্শ যুক্ত করতে পারি। ম্যানিফেস্ট.এক্সএমএল ফাইলে, নিশ্চিত হয়ে নিন যে কল ব্যাক করার সময় হোস্টিং ক্রিয়াকলাপ শেষ হয়নি এবং শুরু করার ক্রিয়াকলাপটি স্ট্যান্ডার্ড হিসাবে লঞ্চ মোড রয়েছে। নীচে হিসাবে বিশদ দেখুন:

হোস্টিং ক্রিয়াকলাপের জন্য, ইতিহাসের সম্পত্তিটিকে মিথ্যা হিসাবে সেট করুন

android:noHistory="false"

ক্রিয়াকলাপ শুরু হওয়ার জন্য, যদি থাকে তবে লঞ্চ মোডটিকে মান হিসাবে সেট করুন

android:launchMode="standard"

13

যুক্তি হিসাবে পাস করার সাথে সাথে আমি এই ব্লকের কোডের ব্লকটি একটি ফ্রেগমেন্টের বাইরে কোনও ইউটিলিটি ক্লাসে স্থানান্তরিত করার পরেও একই সমস্যার মুখোমুখি হয়েছি ,parentActivity

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

তারপর আমি যে কোন মান নয় পেয়ে ছিল onActivityResultযে পদ্ধতি অসম্পূর্ণ অংশ , পরবর্তীতে আমি পরিবর্তন যুক্তি করার অসম্পূর্ণ অংশ , তাই ভালো লাগছিল পদ্ধতির সংশোধিত সংজ্ঞা,

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

এর পর, আমি মান পেতে সক্ষম ছিল onActivityResultউপর অসম্পূর্ণ অংশ


10

এই সমস্যাটি আমি একটি খণ্ডেও পেয়েছি। এবং আমি startActivityForResultএকটি কল DialogFragment

কিন্তু এখন এই সমস্যা সমাধান করা হয়েছে:
FragmentClassname.this.startActivityForResult


দুর্দান্ত, আমার পক্ষে কাজ করেছে, কারণ আমি startActivityForResult(...)খণ্ডের কোডের অভ্যন্তরে একটি বিমূর্ত ক্লাস থেকে কল করছি ।
ভিন্স

9

নিস্টেড ফ্রেগমেন্টসগুলির জন্য (উদাহরণস্বরূপ, ভিউপ্যাজার ব্যবহার করার সময়)

আপনার মূল ক্রিয়াকলাপে:

@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) {
    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
}

8

আমার ক্ষেত্রে এটি একটি অ্যান্ড্রয়েড বাগ ছিল ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-framents-android/ ), আপনি যদি সমর্থিত FragmentActivityব্যবহার করেন তবে এর getSupportFragmentManagerপরিবর্তে আপনাকে ব্যবহার করতে হবে getChildFragmentManager:

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

6

সংক্ষেপে,

খণ্ডে, ঘোষণা করুন Fragment fragment = this;

যে ব্যবহারের পরে fragment.startActivityForResult

ফলাফলটি ক্রিয়াকলাপে ফিরে আসবে ult


6

সমাধান 1:

এর startActivityForResult(intent, REQUEST_CODE);পরিবর্তে কল করুন getActivity().startActivityForResult(intent, REQUEST_CODE);

সমাধান 2:

যখন startActivityForResult(intent, REQUEST_CODE);বলা হয় কার্যকলাপ রয়েছে onActivityResult(requestCode,resultcode,intent)প্রার্থনা করা হয়, এবং তারপর আপনি কল করতে পারেন fragments onActivityResult(), এখানে থেকে পাশ করার requestCode, resultCode and intent


5

আপনার খণ্ডের ভিতরে কল করুন

this.startActivityForResult(intent, REQUEST_CODE);

যেখানে thisখণ্ড উল্লেখ করা হয়। অন্যথায় @ ক্লিভেস্টার বলেছেন:

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

আমাকেও ফোন করতে হয়েছিল

super.onActivityResult(requestCode, resultCode, data);

এটি কার্যকর করার জন্য পিতামাতার ক্রিয়াকলাপে onActivityResult

(আমি এই উত্তরটি উত্তর ক্লিভাস্টারের উত্তর থেকে গ্রহণ করেছি))


5

যারা ব্যবহার জন্য অ্যান্ড্রয়েড ন্যাভিগেশন কম্পোনেন্ট ভ্রমণ এর ব্যবহার করা উচিত এটা টুকরা রেফারেন্স এবং কল টুকরা এর এর পেতে ।onActivityResult(...)primaryNavigationFragmentfragment.onActivityResult(...)

এখানে ক্রিয়াকলাপ onActivityResult(...)

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

    for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
    {
            fragment.onActivityResult(requestCode, resultCode, imageData);
    }
}

4

এই উত্তরগুলোর অধিকাংশই বলছে আপনাকে কল করার আছে রাখা super.onActivityResult(...)আপনার হোস্টে Activityআপনার জন্য Fragment। তবে এটি আমার পক্ষে কাজ করছে বলে মনে হয় না।

সুতরাং, আপনার হোস্টে Activityআপনার Fragments onActivityResult(...)পরিবর্তে আপনার কল করা উচিত । এখানে একটি উদাহরণ।

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

আপনার এক পর্যায়ে HostActivityআপনি নির্ধারণ করতে হবে আপনি ব্যবহার করছেন। অথবা, এটিতে আপনার কোনও রেফারেন্স রাখার পরিবর্তে তা পেতে ব্যবহার করুন । এছাড়াও, আপনি কল করার চেষ্টা করার আগে পরীক্ষা করুন ।this.myFragmentFragmentFragmentManagerFragmentHostActivitynullthis.myFragment.onActivityResult(...);


3
public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

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

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 

3
  1. আপনি কেবল BaseActivity ওভাররাইড করতে পারে onActivityResultটুকরা উপর baseActivity.startActivityForResult

  2. বেসএটিভিটিতে ইন্টারফেস যুক্ত করুন এবং ক্রিয়াকলাপের ফলাফলটি ওভাররাইড করুন।

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
  3. টুকরা প্রয়োগগুলিতে OnBaseActivityResult

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }

এই কর্মচক্রটি কৌশলটি করবে।


3

যদি উপরের সমস্যার মুখোমুখি হয় ফেসবুক লগইন তবে আপনি নীচের কোডটি আপনার খণ্ডের পিতামাতার ক্রিয়াকলাপে ব্যবহার করতে পারেন যেমন:

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);

2

অন্য জবাবের ইতিমধ্যে অন্য উত্তরে বর্ণিত নয়:

onActivityResult()টুকরা হিসাবে ঘোষিত ব্যবহার করার সময় অনুরোধ করা হয় না exception.startResolutionForResult():

if (exception is ResolvableApiException) {
    exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}

এই ক্ষেত্রে exception.startResolutionForResult()টুকরা এর সাথে প্রতিস্থাপন করুন startIntentSenderForResult():

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}

2

কোটলিন সংস্করণ (ক্রিয়াকলাপের ফলাফলগুলিতে আপনার কার্যকলাপে) ()

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }

1

অলি সি যেমন উল্লেখ করেছেন, আপনি যখন নেস্টেড টুকরো ব্যবহার করছেন তখন অ্যাক্টিভিটিআরসাল্টে ফেরত মানগুলি ব্যবহার করে সমর্থন লাইব্রেরির জন্য একটি সক্রিয় বাগ রয়েছে। আমি শুধু এটি আঘাত :-(।

ফ্রেগমেন্ট.অনঅ্যাক্টিভিটি ফলাফল দেখুন যখন অনুরোধকড! = 0 এ কল করা হয় না


1

আমার দৃ strong় সন্দেহ আছে যে এখানে সমস্ত উত্তর হ্যাক ছাড়া কিছুই নয়। আমি তাদের এবং আরও অনেককে চেষ্টা করে দেখেছি, তবে কোনও নির্ভরযোগ্য উপসংহার ছাড়াই সবসময় বোকামির সমস্যা থাকে। আমি কারও পক্ষে অসামঞ্জস্যপূর্ণ ফলাফলের উপর নির্ভর করতে পারি না। আপনি যদি খণ্ডগুলির জন্য অফিসিয়াল অ্যান্ড্রয়েড এপিআই ডকুমেন্টেশনটি দেখেন তবে আপনি গুগলকে পরিষ্কারভাবে নিম্নলিখিতটি দেখবেন:

খণ্ডটির এতে থাকা ক্রিয়াকলাপ থেকে স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট (ইনটেন্ট, ইন) কল করুন।

দেখুন: অ্যান্ড্রয়েড ফ্রেগমেন্ট এপিআই

সুতরাং, মনে হবে যে অধিকাংশ সঠিক এবং নির্ভরযোগ্য পন্থা আসলে ডাকতে হবে startActivityForResult () হোস্টিং কার্যকলাপ থেকে এবং ফলে হ্যান্ডেল onActivityResult () সেখান থেকে।


2
আমি মনে করি না যে "ক্রিয়াকলাপ থেকে কলিং স্টার্টএ্টিভিটি ফর রিসাল্ট" একটি প্রস্তাবনা। যদি আপনি ফ্রেগমেন্ট বেস বর্গের ভিতরে বাস্তবায়নের দিকে নজর দেন, তবে এটি কেবল যা হয় mActivity.startActivityFromFragment(this, intent, requestCode)- তাই এটি কোনও
সুবিধাযুক্ত

1

আপনার কোডে নেস্টেড টুকরা রয়েছে। সুপার.অ্যাক্টিভিটি ফর রিসাল্ট কল করা কার্যকর হয় না

আপনার খণ্ডটি কল করা যেতে পারে এমন প্রতিটি ক্রিয়াকলাপ আপনি সংশোধন করতে চান না বা খণ্ড শৃঙ্খলে প্রতিটি খণ্ডকে কল করার আশেপাশে কোনও কাজ করতে চান।

এখানে অনেকগুলি কাজের সমাধানের মধ্যে একটি one ফ্লাইতে একটি টুকরো তৈরি করুন এবং এটি সমর্থন ফ্রেগমেন্ট ম্যানেজারের সাথে ক্রিয়াকলাপে সরাসরি তারে দিন। তারপরে নতুন তৈরি হওয়া খণ্ডটি থেকে স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট কল করুন।

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();
}

এটি আসলে কাজ করে এবং আমি এর জন্য একটি মাত্র ভোট পেয়েছি। উড়তে একটি খণ্ড তৈরি করুন। খুব সহজ তবে এর আসল কার্যক্ষম সমাধান। এমনকি কেউ আমার জন্য এটি সম্পাদনা করার চেষ্টা করেছিল।
danny117

1

আমার সমস্যাটি হোস্ট ক্রিয়াকলাপের সাথে ছিল আমি এটি সেট সহ পেয়েছি এটি android:launchMode="standard"এটিকে অস্থায়ীভাবে সরিয়েছি!


1

এক পয়েন্ট কারও কাছেই এটির mentionনিশ্চিত হওয়া উচিত নয় যে আপনার হোস্ট ক্রিয়াকলাপের প্রবর্তন মোডটি অবশ্যই সেট করতে হবে না singleInstanceবা singleTask

আপনার লঞ্চ মোডটি সিঙ্গলআইন্সট্যান্স বা সিঙ্গলটাস্কে সেট করা থাকলে onActivityResult কাজ করবে না। অথবা আপনি এই ইনটেন্ট ফিল্টারগুলি ব্যবহার করে আপনার ক্রিয়াকলাপটি কল করেন

standardবা singleTopলঞ্চ মোড ঠিকঠাক কাজ করবে।


1

যদি আপনি নেস্টেড টুকরা ব্যবহার করে থাকেন তবে এটিও কাজ করছে:

getParentFragment().startActivityForResult(intent, RequestCode);

এটির পাশাপাশি, আপনাকে super.onActivityResultপিতামাতার ক্রিয়াকলাপ থেকে কল করতে হবে এবং খণ্ডটির onActivityResultপদ্ধতিটি পূরণ করতে হবে ।


1

আমি প্রসারিত বেস ক্লাসটি লিখে সমস্যাটি পরিচালনা করেছি Fragmentএবং onactivityresultক্রিয়াকলাপে আমি বর্তমানে ব্যবহার করে চলমান খণ্ডটি চিহ্নিত করেছি fragmenttag। তারপরে আমি ফ্র্যাগমেন্টবেস ক্লাসে একটি ব্যবহারকারী-সংজ্ঞায়িত পদ্ধতি কল করি। এটি বর্তমানে চলমান খণ্ডে একটি ইভেন্ট চালিত করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.