স্টার্টএটিভিটি ফর রিসাল্ট () একটি টুকরা এবং সমাপ্ত শিশু ক্রিয়াকলাপ থেকে, কলকরণে অ্যাক্টিভিটি রেজাল্ট () কল করবেন না


172

FirstActivity.JavaFragmentA.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
এটিকে (অ্যাক্টিভিটিস রেজাল্ট পদ্ধতি) ফার্স্টঅ্যাক্টিভিটি ক্লাসে রাখার চেষ্টা করুন
ভাইপ্লেজার

উত্তর:


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
ধন্যবাদ কেভিন, আপনি যা বলেছিলেন তা চেষ্টা করেছিলাম কিন্তু তা কার্যকর হচ্ছে না। কিন্তু আমি কোড debugged, আমি দেখি onActivityresult()এর FirstAcivity.Javaনামক পরার এবং onActivityresult()এর FragmentA.Javaডাকে কখনো দেখায়। সাহায্য করুন.
মিঃ রওশন পওয়ার

52
দয়া করে getActivity () প্রতিস্থাপন করুন start স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট সহ (i, 1);
কেভিন আডেসারা

14
এটি কি হতে পারে যে গৃহীত সমাধানের উত্তরটি আসলে এখানে ভুল তা নয়, এবং আসল সমাধানটি কেবল startActivityForResultপরিবর্তে ব্যবহার করা উচিত getActivity().start...? কারণ যতদূর আমি দেখতে পাচ্ছি, আপনি onActivityResultক্রিয়াকলাপে তার নিজস্ব সংজ্ঞা দিয়ে সংজ্ঞাটিকে ওভাররাইড করে চলেছেন (অর্থাত্ এটি ঠিক একইরকম আচরণ করে যেমন উত্তরে ওভাররাইডটি বিদ্যমান ছিল না)।
amnn

পছন্দ করুন সম্ভবত এটিই কারণ।
অ্যান্ড্রয়েড বিকাশকারী

1
আপনার ব্যাখ্যা অনুসারে আমিও একই কাজ করি, ক্রিয়াকলাপে ক্রিয়াকলাপে ক্রিয়াকলাপে অ্যাক্টিভিটিস রেজাল্ট () ওভাররাইড করে উভয় ক্ষেত্রে সুপার দিয়ে তৈরি করুন এবং ক্রিয়াকলাপটিঅ্যাক্টিভিটি ফর রিসাল্ট (অভিপ্রায়, আমি) তৈরি করুন, তবে কাজ করেনি, আমার সাহায্য প্রয়োজন
আমল ক্রোনজ

33

কেভিনের উত্তরটি কাজ করে তবে সেই সমাধানটি ব্যবহার করে ডেটা দিয়ে খেলানো শক্ত করে তোলে।

সেরা সমাধান startActivityForResult()ক্রিয়াকলাপ পর্যায়ে শুরু হয় না ।

আপনার ক্ষেত্রে ফোন না getActivity().startActivityForResult(i, 1);

পরিবর্তে, কেবল ব্যবহার করুন startActivityForResult()এবং এটি পুরোপুরি সূক্ষ্মভাবে কাজ করবে! :)


27

নিম্নলিখিত হিসাবে আপনার অবশ্যই প্রথমআকাটিভিটিঅ্যাক্টিভিটি রেজাল্ট () লিখতে হবে ava

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

এটি ফার্স্টঅ্যাক্টিভিটি.জভাতে টুকরাগুলির ক্রিয়াকলাপ ফলাফল ফলাফল চালু করবে trigger


2
ধন্যবাদ বন্ধু ! তবে এটি একটি স্তরের 26 এপিআইয়ের প্রয়োজনীয়তা রয়েছে .. সুতরাং আমার ক্ষেত্রে আমি getSupportFraamentManager () সন্ধান করুনফ্রেগমেন্টবিটাইগ পদ্ধতিটি ব্যবহার করেছি তবে আপনার ধারণার সাথে
ডাগনোগো জাঁ-ফরাসোইস


7

সর্বাধিক গুরুত্বপূর্ণ বিষয়, যেটি এখানে নিখোঁজ রয়েছে তা হ'ল ... ফার্স্টএকটিভিটির লঞ্চমোডটি অবশ্যই এককথায় হওয়া উচিত। যদি এটি সিঙ্গলইনস্ট্যান্স হয় তবে ফ্র্যাগমেন্টএ-তেঅ্যাক্টিভিটিস রেজাল্ট স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট পদ্ধতিটি কল করার পরে ডাকা হবে। সুতরাং, এটি সেকেন্ডঅ্যাক্টিভিটিতে ফিনিস () পদ্ধতিটি কল করার জন্য অপেক্ষা করবে না।

সুতরাং নিম্নলিখিত পদক্ষেপগুলি অতিক্রম করুন, এটি অবশ্যই দীর্ঘসময় গবেষণার পরে যেমন কাজ করেছে আমার পক্ষে কাজ করবে।

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলে, ফার্স্টএকটিভিটির লঞ্চমোড তৈরি করুন ava জাভা কে সিঙ্গলটপ হিসাবে।

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

ফার্স্টঅ্যাক্টিভিটি.জভাতে ,অ্যাক্টিভিটিস রেজাল্ট পদ্ধতিতে ওভাররাইড করুন। এটি ফ্র্যাগমেন্টএ-এরঅ্যাক্টিভিটি রেজাল্ট হিসাবে কল করবে।

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

ফ্রেগমেন্টএজভাতে ,অ্যাক্টিভিটিস রেজাল্ট পদ্ধতিতে ওভাররাইড করুন

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

startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);ফ্রেগমেন্টএ.জাভা থেকে কল করুন

finish();সেকেন্ডঅ্যাক্টিভিটি.জভাতে কল পদ্ধতি

আশা করি এটি কার্যকর হবে।


এটি সেরা উত্তর। ম্যানিফেস্টে "লঞ্চমোড" সংজ্ঞায়নের বিশদটি গুরুত্বপূর্ণ।
পাবলো ইনসুয়া

5

আমরা startActivityForResult()সরাসরি খণ্ড থেকে কল করতে পারি তাই আপনার this.startActivityForResult(i, 1);পরিবর্তে কল করা উচিতgetActivity().startActivityForResult(i, 1);

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

ক্রিয়াকলাপ আপনার খণ্ডে ক্রিয়াকলাপের ফলাফল প্রেরণ করবে।


1

উত্তরের জন্য দেরি হোক তবে যে কারও জন্য সহায়ক হবে।

আমার ক্ষেত্রে ফ্রেগমেন্ট থেকে ক্রিয়াকলাপ কল করতে চান এবং খণ্ডটি থেকে পুনরায় ফলাফল নির্ধারণ করতে চান।

আমি ফ্র্যাগমেন্ট লাইকের getContext ব্যবহার করেছি।

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

এবং টুকরা থেকে ফলাফল নির্ধারণ করুন

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

মেইনঅ্যাক্টিভিটির অন্যাক্টিভিটিস রেজাল্ট () কল করবে, ফ্র্যাগমেন্টের অন্যাক্টিভিটিস রিসাল্ট () কল করবে না কারণ খণ্ডটি ক্রিয়াকলাপে স্থাপন করা হয়েছে যাতে স্পষ্টতই এটি মূলঅ্যাক্টিভিটিতে ফিরে আসে



-6

আপনার onActivityresult()প্যারেন্টএকটিভিটিতে কল করুন ।


উত্তর @ অ্যান্ড্রয়েডের জন্য ধন্যবাদ, তবে সমাধানটি পেয়েছি। আপনার সমাধান নিখুঁত নয়। এটি ভালো প্রোগ্রামিং নয়।
মিঃ রওশন পাওয়ার

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