অ্যাক্টিভিটি রিসাল্টে ভুল অনুরোধ কোড ode


310

আমি আমার ফ্র্যাগমেন্ট থেকে একটি নতুন ক্রিয়াকলাপ শুরু করছি

startActivityForResult(intent, 1);

এবং টুকরাটির পিতামাতার ক্রিয়াকলাপে ফলাফলটি পরিচালনা করতে চান:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (requestCode == 1) {
        // bla bla bla
    }
}

সমস্যাটি হ'ল requestCodeআমি সবেমাত্র পোস্ট করেছি এমন কখনও পাই নি startActivityForResult()

আমি ভালো কিছু পেয়েছিলাম 0x40001, 0x20001একটি র্যান্ডম উচ্চতর বিট সেট দিয়ে ইত্যাদি। ডক্স এ সম্পর্কে কিছুই বলে না say কোন ধারনা?


উত্তর:


837

আপনি startActivityForResult()আপনার কাছ থেকে ফোন করছেন Fragment। আপনি যখন এটি করেন, এটি মালিকানার মালিকানা requestCodeদ্বারা পরিবর্তিত হয় ।ActivityFragment

আপনি যদি resultCodeআপনার ক্রিয়াকলাপে সঠিক পেতে চান তবে এটি ব্যবহার করে দেখুন:

পরিবর্তন:

startActivityForResult(intent, 1);

প্রতি:

getActivity().startActivityForResult(intent, 1);

44
কারণ এটি সিদ্ধান্ত নিতে হবে কোন টুকরোটি ফলাফল সরবরাহ করবে। সুতরাং যখন টুকরা কল স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট। অনুরোধকোডটি ক্রিয়াকলাপ দ্বারা পরিবর্তিত হবে, সুতরাং এটি কীভাবে টুকরোটিতে ফলাফল বিতরণ করবে তা জানতে পারবে। আপনি যদি সত্যিই অ্যাক্টিভিতে ফলাফল পেতে চান। শুধু getActivity () কল করুন। startActivityForResult ()।
চ্যাংওই ইয়াও

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

31
"অনুরোধকোডটি সেই খণ্ডটির মালিকানাধীন ক্রিয়াকলাপ দ্বারা পরিবর্তিত হয়েছে" - গোটার অ্যান্ড্রয়েড ডিজাইন পছন্দ হয় ...
টিয়াগো

13
এ জাতীয় একটি গুরুত্বপূর্ণ তথ্য, আপনি ডক্সে কোথাও পরিষ্কার দেখতে পাচ্ছেন না। আপনার জীবনকে নরক হিসাবে তৈরি করার জন্য ডিজাইন করা অ্যান্ড্রয়েড ডিজাইনটি পছন্দ করে।
ড্রিস বাউনউয়ার

2
মানুষ আমি আপনাকে ভালবাসি, আমি এই সমস্যাটি বোঝার এবং ত্রুটিটি সমাধান করার চেষ্টা করে অনেক দিন ব্যয় করেছি, ধন্যবাদ!
tinyCoder

35

অনুরোধ কোডটি ভুল নয়। ভি 4 সমর্থন লাইব্রেরি টুকরা ব্যবহার করার সময়, খণ্ডের সূচকটি অনুরোধ কোডের শীর্ষ 16 বিটগুলিতে এনকোড থাকে এবং আপনার অনুরোধ কোডটি নীচের 16 বিটে থাকে। ফল্ট ইনডেক্স পরে ফলাফল প্রদানের জন্য সঠিক খণ্ডটি খুঁজে পেতে ব্যবহৃত হয়।

সুতরাং ক্রিয়াকলাপগুলির জন্য খণ্ডন অবজেক্টটি ফর্ম শুরু করে, কার্যকারিতা ফলাফলের অনুরোধ কোডটি নীচের মতো হ্যান্ডেল করুন:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

1
দুর্দান্ত সমস্যা যা এই সমস্যাটির সঠিক কারণ ব্যাখ্যা করে
মুজিকান্ত

তাত্ক্ষণিক প্রশ্ন: সূচিপত্র কী?
লুই সাই

indexOfFragment সূচক যে getSupportFragmentManager () getFragments () উৎপন্ন হয়।
HerberthObregon

25

সহজ:

জাভা : int unmaskedRequestCode = requestCode & 0x0000ffff

কোটলিন : val unmaskedRequestCode = requestCode and 0x0000ffff

নিম্নে 16 টি বিট পরীক্ষা করে দেখুন, কেবলমাত্র এটি লজিকাল করে এবং উপরের 16 বিট শূন্যের সাথে আনমাস্ক করুন

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}

1
এটি আসল অনুরোধ কোডটি না দেওয়ার কারণ আপনি আমাকে বলতে পারেন?
কে.সোফিয়াক

3
অনুরোধকডটি ক্রিয়াকলাপটির মালিকানাধীন ক্রিয়াকলাপ দ্বারা পরিবর্তিত হয়েছে। Ashlesha শর্মা উত্তর দেখার
জেইমি Agudo

আপনাকে ধন্যবাদ, আমি এই উত্তরটি খুঁজছিলাম। আমি দেখতে পাচ্ছি না কেন অ্যান্ড্রয়েড যদিও মূল অনুরোধ কোডটি ফেরত দিতে পারে না।
টনসিভস

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

6

আপনি যদি ধ্রুবক সরবরাহ করে থাকেন তবে এটিকে সর্বজনীন করুন এবং তারপরে ব্যবহার করুন startActivityResult

উদাহরণ:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

2

আপনি
super.onActivityResult(requestCode, resultCode, data)
এটি Activity(যদি আপনি ওভাররাইড করেন onActivityResult) এও সংজ্ঞা দিতে পারেন

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

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

এবং কল startActivityForResult(intent, requestCode) ভিতরেFragment


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