android OnactivityResult Fragment বলা হচ্ছে না



android-fragments android-activity (24)

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

আপনার প্রধান কার্যকলাপে:

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

এই টুকরা হোস্টিং কার্যকলাপ ক্যামেরা কার্যকলাপ ফেরৎ যখন বলা হয় 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);
    }
}

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

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

তারপর আমি যে ফ্র্যাগমেন্টের onActivityResult পদ্ধতিতে কোনও মান খুঁজে onActivityResult , onActivityResult , আমি ফ্র্যাগমেন্টে যুক্তি পরিবর্তন করেছিলাম, তাই পদ্ধতিটির সংশোধিত সংজ্ঞাটি দেখতে পেলাম,

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

এর পর, আমি Fragment উপর onActivityResult মধ্যে মান পেতে সক্ষম হয়েছিল


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

কল শুরু করুনঅ্যাক্টিভিটি ফোরাম (ইন্টেন্ট, int) ফাটল এর ধারণকারী কার্যকলাপ থেকে।

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

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


আপনার টুকরা ভিতরে, কল

this.startActivityForResult(intent, REQUEST_CODE);

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

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

আমি কল ছিল

super.onActivityResult(requestCode, resultCode, data);

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

(আমি এই উত্তরটি @ ক্লেভেস্টার এর উত্তর থেকে অভিযোজিত।)


সবচেয়ে সহজ পদ্ধতি হল আপনার ফাটল থেকে একটি ক্রিয়াকলাপ শুরু করা।

startActivity(ActivityName);

তারপরে, আপনি startActivityForResult(intent,"1"); কল করুন startActivityForResult(intent,"1"); আপনার কার্যকলাপ থেকে এবং আপনার কার্যকলাপ অ্যাক্টিভিটি onActivityResult যোগ করুন

startActivityForResult(intent,"1");

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors

finish(); // finish the activity will  get to back to your fragment.
}

শুধু খণ্ড জন্য নীচের কোড ব্যবহার করুন।

@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 তার পিতা বা মাতা কল ছাড়া কল করবে।


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

code.google.com/p/android/issues/detail?id=15394


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

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

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

android:noHistory="false"

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

android:launchMode="standard"

সমাধান 1:

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

সমাধান 2:

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


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

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

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

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

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

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

আপনার startActivityForResult(intent,111); ফলাফল পেতে নিশ্চিত করুন আপনি startActivityForResult(intent,111); কল করুন startActivityForResult(intent,111); পরিবর্তে getActivity().startActivityForResult(intent,111); আপনার টুকরা ভিতরে।


আমি শুধু একটি workaround পদ্ধতি করা:

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

আপনার ফ্র্যাগমেন্টে, শুরু করার আগে অ্যাক্টিভিটি রিসাল্ট সেট করুন

MainActivity._tempFragment = this;

অন ​​অ্যাক্টিভিটি রিসাল্ট <- ফ্র্যাগমেন্টে

@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পদ্ধতিটি পূরণ করুন ।


এটি সবচেয়ে জনপ্রিয় সমস্যা এক। আমরা এই সমস্যা সংক্রান্ত থ্রেড প্রচুর পাওয়া যাবে। কিন্তু তাদের কেউ আমার জন্য দরকারী।

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

আসুন প্রথমে বুঝি কেন এই ঘটছে।

আমরা startActivityForResult থেকে সরাসরি অ্যাক্টিভিটিফোরসেল্ট কল করতে পারি তবে আসলে পিছনে থাকা মেকানিকটি কার্যকলাপ দ্বারা পরিচালিত হয়।

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

একবার ক্রিয়াকলাপটি নেভিগেট করা হয়ে গেলে, ফলাফলটি কার্যকলাপের অনঅ্যাক্টিভিটি রিসাল্টে সংশোধিত অনুরোধ কোড সহ পাঠানো হবে যা মূল অনুরোধকোড + ফ্র্যাগমেন্টের পরিচয়তে ডিকোড করা হবে। তারপরে, কার্যকলাপ অ্যাক্টিভিটি রিসাল্টের মাধ্যমে যে ফ্র্যাগমেন্টের ক্রিয়াকলাপ ফলাফল পাঠাবে। এবং এটা সব সম্পন্ন।

সমস্যা হল:

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

সমাধান:

1) নীচের কোড দ্বারা আপনার Fragment মধ্যে অভিপ্রায় শুরু করুন:

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

2) এখন আপনার অভিভাবক কার্যকলাপের মধ্যে ** onActivityResult() অ্যাক্টিভিটি 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) {

       }
}

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


যদি onActivityResultফ্যাগমেন্ট ক্লাসের ভিতরে থাকা পদ্ধতিতে সমস্যা হয় এবং আপনি এমন কিছু আপডেট করতে চান যা ফ্র্যাগমেন্ট ক্লাসের ভিতরেও থাকে তবে ব্যবহার করুন:

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

    if(resultCode == Activity.RESULT_OK)
    {
        // If the user had agreed to enabling Bluetooth,
        // populate the ListView with all the paired devices.
        this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
        for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
        {
            this.arrayDevice.add(bd.getAddress());
            this.btDeviceList.setAdapter(this.arrayDevice);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

শুধু this.variableউপরে কোড দেখানো হিসাবে যোগ করুন । অন্যথায় পদ্ধতিটি অভিভাবক কার্যকলাপের মধ্যে বলা হবে এবং পরিবর্তনশীল বর্তমান ইনস্ট্যান্সের আপডেট হবে না।

আমি কোডের এই ব্লকটিকে ক্লাসে MainActivityপ্রতিস্থাপন thisকরে HomeFragmentএবং ভেরিয়েবলগুলিকে স্থিতিশীল করেও এটি পরীক্ষা করেছি। আমি প্রত্যাশিত হিসাবে আমি ফলাফল পেয়েছিলাম।

সুতরাং আপনি যদি নিজের অংশটি প্রয়োগ করার জন্য ফ্যাগমেন্ট ক্লাসটি চান তবে onActivityResultউপরের কোডের উদাহরণটি উত্তর।


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

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

public class HostActivity extends Activity {

    private MyFragment myFragment;

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

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


সংক্ষেপে,

ফাটল মধ্যে, Fragment fragment = this ঘোষণা;

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

ফলাফল কার্যকলাপ ফিরে আসবে।


আপনার পয়েন্ট mentionহোস্ট কার্যকলাপ লঞ্চ মোড সেট singleInstanceবা সেট করতে হবে না তা নিশ্চিত করুন যে এক পয়েন্ট কোন এক singleTask

OnActivityResult আপনার লঞ্চ মোড যদি SingleInstance বা SingleTask এ সেট থাকে তবে কাজ করবে না। অথবা আপনি এই অভিপ্রায় ফিল্টার ব্যবহার করে আপনার কার্যকলাপ কল

standardবা singleTopলঞ্চ মোড সূক্ষ্ম কাজ করবে।


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

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

আপনার কোড একটি নিস্তেজ ফাটল আছে। 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();
}

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

আপনার প্রধান কার্যকলাপে :

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

uniqueInstanceInt - এটি একটি এনটি দিয়ে প্রতিস্থাপন করুন যা নেস্টেড টুকরাগুলির মধ্যে অনন্য যা অন্য ফ্যাগমেন্টকে উত্তর দেওয়ার জন্য প্রতিরোধ করে।

প্রতিক্রিয়া পান

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

মনোযোগ

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


  1. আপনি কেবল বেস onActivityResult অনঅ্যাক্টিভিটি onActivityResult ফ্র্যাগমেন্ট baseActivity.startActivityForResult onActivityResult এ ওভাররাইড করতে পারেন।

  2. বেস অ্যাক্টিভিটি উপর ইন্টারফেস যোগ করুন এবং অ্যাক্টিভিটি Result উপর override।

    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. Fragment অন 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();
      }
    }

এই workaround কৌতুক করতে হবে।





android-activity