একটি ট্যাবহস্ট ক্রিয়াকলাপ থেকে কীভাবে ফলাফল (startActivityForResult) ফেরত পাবেন?


275

আমার উদাহরণে আমার 3 টি ক্লাস রয়েছে: ক্লাস এ, প্রধান ক্রিয়াকলাপ। ক্লাস এ একটি স্টার্টঅ্যাক্টিভিটি ফর রিসাল্টকে কল করে:

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

ক্লাস বি, এই শ্রেণিটি একটি ট্যাবঅ্যাক্টিভিটি:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

ক্লাস সি, এই শ্রেণিটি নিয়মিত ক্রিয়াকলাপ:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult এ ক্লাস A তে ডাকা হয়, তবে রেজাল্টকোড RESULT_CANCELEDপরিবর্তে হয় RESULT_OKএবং প্রতীয়মান উদ্দেশ্য বাতিল হয় ull আমি কীভাবে কোনও ট্যাবহোস্টের ভিতরে ক্রিয়াকলাপ থেকে কিছু ফিরিয়ে দেব?

আমি বুঝতে পারি যে সমস্যাটি আমার ক্লাস সি আসলে ক্লাস বি এর অভ্যন্তরে চলছে এবং ক্লাস বিটি RESULT_CANCELEDক্লাস এ-তে ফিরে যাচ্ছেন আমি এখনও কোনও কাজ জানি না।

উত্তর:


366

ওহ খোদা! বেশ কয়েক ঘন্টা ব্যয় এবং অ্যান্ড্রয়েড উত্স ডাউনলোড করার পরে, আমি অবশেষে একটি সমাধানে এসেছি।

আপনি যদি ক্রিয়াকলাপ শ্রেণীর দিকে নজর দেন, আপনি দেখতে পাবেন যে finish()কোনও mParentসম্পত্তি সেট করা থাকলে সেই পদ্ধতিটি কেবল ফলাফলটি ফেরত পাঠায় null। নইলে ফলাফল হারিয়ে যায়।

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

সুতরাং আমার সমাধানটি উপস্থিত থাকলে পিতামাতার ক্রিয়াকলাপের ফলাফল নির্ধারণ করা হ'ল:

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

আমি আশা করি যে কেউ যদি আবার এই সমস্যাটির সমাধানের চেষ্টা করে তবে তা সহায়ক হবে।


1
আমি এখানে একটি হ্যাকি সমাধান পোস্ট করেছি, এটির সহজ এবং এতে কোনও বিষয়বস্তু না দিয়ে একটি স্বচ্ছ ক্রিয়াকলাপ জড়িত - এটি স্বাভাবিক জীবনচক্রের কার্য সম্পাদন করে এবং সবকিছু সহজ করে তোলে। stackoverflow.com/questions/7812120/…
সিকিউএম

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

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

11
এপিআই গাইডগুলিতে কোথাও নথিভুক্ত নয় এমন একটি ক্রিয়াকলাপের ফলাফল কেন ফিরে আসছে, আমাকে বিজোড় হিসাবে আঘাত করেছে।
alex.p

অভিশাপ! ভাল চাকরি, ইলিয়া! ধন্যবাদ
সাইরেলন

64

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

"Param_result" এর জন্য সামান্য পরিবর্তন সহ

/* Start Activity */
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
    startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case 90:
        if (resultCode == RESULT_OK) {
            Bundle res = data.getExtras();
            String result = res.getString("param_result");
            Log.d("FIRST", "result:"+result);
        }
        break;
    }
}

private void finishWithResult()
{
    Bundle conData = new Bundle();
    conData.putString("param_result", "Thanks Thanks");
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(RESULT_OK, intent);
    finish();
}

2
সহজ, setResultপ্রধান জিনিস ছিল। এটি কোনও কিছুর সাথে সেট করুন বা উদাহরণ হিসাবে একটি মান RESULT_OKএবং আপনি যেতে ভাল; setResult(RESULT_OK);। আমাকে সহায়তা করেছে, +1
আফজাল আহমেদ জিশান

16

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

যদি সেট করা হয় এবং এই উদ্দেশ্যটি বিদ্যমান বিদ্যমান থেকে একটি নতুন ক্রিয়াকলাপ চালু করতে ব্যবহৃত হয়, তবে বিদ্যমান ক্রিয়াকলাপের জবাব লক্ষ্যটি নতুন ক্রিয়াকলাপে স্থানান্তরিত হবে।


1

আপনি ক্লাস বি তে একটিঅ্যাক্টিভিটি রেজাল্ট বাস্তবায়ন করতে এবং স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট ব্যবহার করে ক্লাস সি চালু করতে পারেন। আপনি একবার ক্লাস বিতে ফলাফল পেলে ক্লাস সি থেকে প্রাপ্ত ফলাফলের উপর ভিত্তি করে সেখানে ফলাফল স্থাপন করুন (ক্লাস এ জন্য) আমি এটি চেষ্টা করে দেখিনি তবে আমার মনে হয় এটি কার্যকর হওয়া উচিত।

আরেকটি বিষয় সন্ধান করতে হবে এটি হল যে ক্রিয়াকলাপি A এর একক আইটেম ক্রিয়াকলাপ হওয়া উচিত নয়। স্টার্টঅ্যাক্টিভিটিফরালসাল্টের জন্য আপনার ক্লাস বিকে ক্রিয়াকলাপ এ এর ​​একটি সাব ক্রিয়াকলাপ হওয়া দরকার এবং এটি কোনও একক ক্রিয়াকলাপে সম্ভব নয়, নতুন ক্রিয়াকলাপ (ক্লাস বি) একটি নতুন কার্য শুরু হয়।


1
যেহেতু ক্লাস বি একটি ট্যাবএকটিভিটি এবং ক্লাস সি সেই ক্রিয়াকলাপের একটি ট্যাব আপনি ক্লাস বিতে কোনও স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট করতে পারবেন না আমার কোনও কার্যক্রমই একক নজরের ক্রিয়াকলাপ নয়।
ক্যামেরন ম্যাকব্রাইড

-1

ক্রিয়াকলাপ 1 থেকে ক্রিয়াকলাপ 2 শুরু করার জন্য এবং ফলাফল পেতে, আপনি startActivityForResult ব্যবহার করতে পারেন এবং ক্রিয়াকলাপ 1 তেঅ্যাক্টিভিটি রেজাল্ট প্রয়োগ করতে পারেন এবং ক্রিয়াকলাপ 2 এ সেটআরসাল্ট ব্যবহার করতে পারেন।

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.