BACK বোতাম টিপলে setResult কাজ করে না


111

ব্যাক বোতামটি চাপ দেওয়ার পরে আমি রেজাল্ট সেট করার চেষ্টা করছি। আমি অনডেট্রয়ে কল করি

Intent data = new Intent();
setResult(RESULT_OK, data) 

কিন্তু যখন আসে

onActivityResult(int requestCode, int resultCode, Intent data) 

রেজাল্ট কোডটি 0 (RESULT_CANCELED) এবং ডেটা 'নাল'।

সুতরাং, আমি কীভাবে ব্যাক বোতাম দ্বারা বন্ধ হওয়া ক্রিয়াকলাপের ফলাফলটি পাস করতে পারি?

উত্তর:


159

আপনাকে onBackPressed()পদ্ধতিটি অতিক্রম করতে হবে এবং সুপারক্লাসে কল করার আগে ফলাফল নির্ধারণ করতে হবে, অর্থাৎ

@Override
public void onBackPressed() {
    Bundle bundle = new Bundle();
    bundle.putString(FIELD_A, mA.getText().toString());
    
    Intent mIntent = new Intent();
    mIntent.putExtras(bundle);
    setResult(RESULT_OK, mIntent);
    super.onBackPressed();
}

23
মনে রাখবেন যে আপনি যদি এই পন্থাটি ব্যবহার করেন তবে উপরের মতো করে সুপারসনল্ট () কল করার পরে সুপার.অনব্যাকপ্রেসড () অনুরোধটি অবশ্যই ঘটবে বা আপনার আবারও মূল সমস্যাটি হবে!
জেঞ্জেলসমা

1
এটি এখানে সেরা উত্তর। যদি আমরা অনপজ () বা onDestroy () ওভাররাইড করি তবে অনব্যাকপ্রেসড () প্রথমে ডাকা হবে এবং এর ফলাফল 0 এ আসবে Please দয়া করে সচেতন হন!
মারেক

অথবা আপনি অনক্রিয়েটে ডিফল্ট ফলাফল সেট করতে পারেন। সমাপ্তির আগে যে কোনও জায়গা () ঠিক আছে।
হেলিন ওয়াং

5
আমি অনুরূপ পদ্ধতির প্রয়োগ করেছি তবে এটি এখনও কার্যকর হচ্ছে না। উদাহরণস্বরূপ আমার কাছে রিকোয়েস্ট কোড এবং উদ্দেশ্যটি কাজ করছে তবে রেজাল্ট কোডটি সর্বদা 0 থাকে
নিয়ন ওয়ারেজ

68

Activityডাকার আগে অবশ্যই ফলাফল নির্ধারণ করতে হবে finish()। পিছনে ফিরে ক্লিক করা আসলে finish()আপনার কাছে কল করে activity, যাতে আপনি নিম্নলিখিত স্নিপেটটি ব্যবহার করতে পারেন:

@Override
public void finish() {
    Intent data = new Intent();
    setResult(RESULT_OK, data); 

    super.finish();
}

আপনি যদি কল NavUtils.navigateUpFromSameTask();করেন onOptionsItemSelected(), finish()ডাকা হয় তবে আপনি ভুল পাবেন result code। সুতরাং আপনাকে কল finish()করতে হবে navigateUpFromSameTaskনা onOptionsItemSelected()অ্যাক্টিভিটিস রিসাল্টে ভুল অনুরোধ কোড


এটি ওপিএস ক্ষেত্রে কাজ করে, তবে সাধারণভাবে না, তাই না? সমাপ্তির চেয়ে আরও অনেকগুলি পদ্ধতি রয়েছে যা অ্যাপ লাইফাইসাইকেলের শেষ প্রেরণা দেয় (অনপজ () এবং অনডস্ট্রয় () এর মাধ্যমে? অন্যান্য উত্তর আমার মন্তব্য দেখুন।
pjv

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

6
@pjv - আমি আপনার পয়েন্ট পাবেন না, কি finishকি আছে onPauseএবং onDestroy? এগুলি সম্পূর্ণরূপে সম্পর্কিত নয় ব্যতীত finishসমাপ্তির প্রক্রিয়া শুরু হয় যা onPauseএবং onDestroyএর অংশ।
জেবিএম

20

আপনি কিছু কাস্টম সেট করতে চান তাহলে RESULT_CODEonBackPressedআপনাকে প্রথমে সেট করতে হবে তারপর ঘটনা resultএবং তারপর কল super.onBackPressed()এবং আপনি একই পাবেন RESULT_CODEআহ্বানকারী কার্যকলাপ এর onActivityResultপদ্ধতি

    @Override
    public void onBackPressed()
    {
         setResult(SOME_INTEGER);
         super.onBackPressed();
    }

10

আমি আমার কোডটি রিফ্যাক্ট করেছি। প্রাথমিকভাবে আমি কিছু ডেটা প্রস্তুত এবং হিসাবে সেট activity resultমধ্যে onDestroy(এই কাজ করে নি)। activityপ্রতিবার ফেরত পাঠানো ডেটা আপডেট হওয়ার সময় আমি প্রত্যেকবার ডেটা সেট করি এবং এতে কিছুই থাকে না onDestroy


আমার ডেটা "
অনপজ

আপনি কল করার পরে যদি আপনার ক্রিয়াকলাপটি পুনরায় তৈরি হয় setResult(), তবে আপনার ডেটা নষ্ট হয়ে যাবে।
জ্যারেট মিল্লার্ড 12'16

3

আপনার পছন্দ অনুযায়ী ওপশন আইটেমটি নির্বাচিত হওয়া উচিত :

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        final Intent mIntent = new Intent();
        mIntent.putExtra("param", "value");
        setResult(RESULT_OK, mIntent);
        finish();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

2

পড়ুন onActivityResult (int-, int- ইন্টেন্ট) ডক

সমাধানটি ক্রিয়াকলাপের জন্য রেজাল্ট কোডটি যাচাই করা হয় RE RE صلاحT_CENCELED । যদি হ্যাঁ হয়, তবে এর অর্থ হ'ল হয় ব্যাক চাপ দেওয়া হয়েছিল বা কার্যকলাপ ক্র্যাশ হয়েছে। আশা করি এটি আপনার জন্য কাজ করে, আমার জন্য কাজ করে :)।


এটি হ'ল সঠিক সমাধান .. আপনাকে রেজাল্ট কোড দিতে হবে .. কোড ছাড়া আপনি ছাড়া আর কেউ ফলাফল নির্ধারণ করতে পারবেন না। সুতরাং, যদি ফলাফলটি ঠিক না থাকে তার অর্থ হয় এর পিছনের টিপুনগুলি বা ক্র্যাশ হয়েছে ..
জন

0

onDestroyশৃঙ্খলে খুব দেরি হয়ে গেছে - পরিবর্তে ওভাররাইড করুন onPauseএবং isFinishing()আপনার ক্রিয়াকলাপটি আপনার জীবনচক্রের শেষে রয়েছে কিনা তা পরীক্ষা করে দেখুন।


1
না, এটাও অনেক দেরি হয়ে গেছে।
alex2k8

আমি এটিকে আসলে একটি বাগ বলেছি : code.google.com/p/android/issues/detail?id=1671 । জটিল অ্যাপ্লিকেশনগুলিতে আমি মনে করি এর কারণে এখানে কিছু আচরণ রয়েছে যা আপনি প্রোগ্রাম করতে পারবেন না।
pjv

এটিও খুব পাল্টা। এত বেশি যে আমি ইতিমধ্যে ইতিমধ্যে 2 বছর সময় ধরে একই ভুল করতে থাকি।
pjv

আসলে - এটি আরও খারাপ। কোডিং করার সাথে সাথে এটি জেবিতে বিদ্যমান। যদি আমি অনপস থেকে সেটরসাল্টকে কল করি তবে এটি কার্যকর করা হয় তবে নেচারি রিটার্ন কার্যকর করা হলে নেট রেজাল্টকোড বা ডেটা সেট করা হয় না। কেন?
বোস্টোন

এবং সে কারণেই: "এই পদ্ধতির প্রয়োগ (অনপস) খুব দ্রুত হওয়া উচিত কারণ পরবর্তী পদ্ধতিটি এই পদ্ধতিটি না ফেরানো
বোস্টোন

0

অনব্যাকপ্রেসড (অ্যান্ড্রয়েড স্তর 5 থেকে উপরে) ওভাররাইড করার চেষ্টা করুন, বা কীডাউন () কে ওভাররাইড করুন এবং কীএভেন্ট.বুতন_ব্যাককে ধরুন ( অ্যান্ড্রয়েড ক্রিয়াকলাপের ফলাফল দেখুন ) এটি আমার জন্য কৌশলটি করে।


0

আপনি যখন প্রাথমিকটিতে ফিরে আসেন তখন কোনও ক্রিয়াকলাপের কারণে অনিয়মের জন্য নির্ধারিত কোনও যুক্তির উপর নির্ভর করবেন না। ডক্স অনুসারে:

এই পদ্ধতির প্রয়োগ (অনপস) খুব দ্রুত হওয়া দরকার কারণ পরবর্তী পদ্ধতিটি এই পদ্ধতিটি ফিরে না আসা পর্যন্ত পুনরায় শুরু করা হবে না

বিশদ জানতে http://goo.gl/8S2Y দেখুন ।

নিরাপদ উপায় হ'ল প্রতিটি ফলাফল পরিবর্তনের কাজ শেষ হওয়ার পরে ফলাফল নির্ধারণ (যেমন আপনি নিজের উত্তরে উল্লেখ করেছেন)


0

আমি উত্তরটি আটকান অন্য ব্যক্তিদের জন্য সহায়ক হতে পারে: যখন অ্যান্ড্রয়েডের সাথে একটি সেট লঞ্চমোড: লঞ্চমোড = "সিঙ্গেল টাস্ক" আমিও ফলাফল পেতে পারি না, ডক বলেছেন:

     /* <p>Note that this method should only be used with Intent protocols
 * that are defined to return a result.  In other protocols (such as
 * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
 * not get the result when you expect.  For example, if the activity you
 * are launching uses the singleTask launch mode, it will not run in your
 * task and thus you will immediately receive a cancel result.
 */

এবং:

     /* <p>As a special case, if you call startActivityForResult() with a requestCode 
 * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your
 * activity, then your window will not be displayed until a result is 
 * returned back from the started activity.  This is to avoid visible 
 * flickering when redirecting to another activity. 
 */
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.