আমি কীভাবে কোনও পিতামাতার ক্রিয়াকলাপে সঠিকভাবে ফিরে যেতে পারি?


179

আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে আমার 2 টি ক্রিয়াকলাপ (এ এবং বি) রয়েছে এবং আমি ক্রিয়াকলাপ এ থেকে ক্রিয়াকলাপ বিতে ক্রিয়াকলাপ বি পেতে একটি অভিপ্রায় ব্যবহার করি: প্যারেন্ট_একটিভিটির ব্যবহার সক্ষম হয়েছে:

 <activity
        android:name=".B"
        android:label="B" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
  </activity>

আমি একটি থিমও ব্যবহার করি যা একটি ইউপি-বোতাম সরবরাহ করে।

আমি বলার পরে বিআইটি ক্রিয়াকলাপে ফিরে আসার জন্য ইউপি-বোতামটি ব্যবহার করতে পারে এ। সমস্যাটি হ'ল অ্যাপ্লিকেশনটি আবার ক্রিয়াকলাপ এ এর ​​ক্রিয়াকলাপটিকে () ফাংশন বলে এবং এটি আমার প্রয়োজনীয় আচরণ নয় seems আমি ক্রিয়াকলাপ বি বলার আগে যেমন দেখায় ঠিক তেমনভাবে দেখতে আমার কার্যকলাপ ক প্রয়োজন A

এই অর্জন করার জন্য একটি উপায় আছে কি?

আগাম ধন্যবাদ

সম্পাদনা করুন:

ক্রিয়াকলাপ বি থেকে ক্রিয়াকলাপ বি শুরু করার জন্য আমি কোনও কোড লিখি না I আমি মনে করি এটি গ্রহন দ্বারা অটোজেনেটেড।

ক্লাস বি এর মতো দেখাচ্ছে:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

বি থেকে ক্রিয়াকলাপ এ শুরু করার জন্য আপনার কোড পোস্ট করুন
ব্যবহারকারী 370305

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

আপনার ট্যাগ সঠিক উত্তর আপডেট করুন! সঠিক উত্তরটি লরেনজিসিকে থেকে আসছে - ব্যবহারকারীর কাছ থেকে নয় ......! এটিকে সঠিক হিসাবে ট্যাগ করা বিভ্রান্তিমূলক এবং আরও বেশি প্রোগ্রামারকে নেভিগেশনের পিছনে নেভিগেশনের বিপরীতে ভুল বোঝাবুঝি করে তোলে!
জোর্ডিড

জি, এখানে অনেক ভুল উত্তর, আপনি দয়া করে এটি পরিষ্কার করতে সাহায্য করতে পারেন ...?
জোর্ডিড

@ এশিয়াকা - আপনার কোড ডিজাইন অনুসারে সঠিক উত্তর আপডেট হয়েছে।
ব্যবহারকারী370305

উত্তর:


333

আপনি launchModeঅ্যান্ড্রয়েড ম্যানিফেস্টে স্ট্যান্ডার্ড সহ ক্রিয়াকলাপ A ঘোষণা করেছেন । ডকুমেন্টেশন অনুসারে , এর অর্থ নিম্নলিখিত:

সিস্টেমটি সর্বদা লক্ষ্য কার্যে ক্রিয়াকলাপের একটি নতুন উদাহরণ তৈরি করে এবং এতে অভিপ্রায়টি চালিত করে।

সুতরাং, onCreateটাস্ক স্ট্যাকটি সঠিকভাবে পরিচালনা করা হলেও সিস্টেমটি ক্রিয়াকলাপ এ (অর্থাৎ কলিং ) পুনরায় তৈরি করতে বাধ্য হয় ।

এই সমস্যাটি সমাধানের জন্য আপনাকে ক্রিয়াকলাপটি পরিবর্তন করতে হবে, ক্রিয়াকলাপের ঘোষণায় নিম্নলিখিত বৈশিষ্ট্য যুক্ত করে:

android:launchMode="singleTop"

দ্রষ্টব্য: কলিং finish()(আগে যেমন সমাধান হিসাবে প্রস্তাবিত) কেবল তখনই কাজ করে যখন আপনি সম্পূর্ণ নিশ্চিত হন যে ক্রিয়াকলাপ বি উদাহরণটি আপনি কার্যকলাপের একটি উদাহরণের উপরে জীবন শেষ করছেন A. আরও জটিল কর্মপ্রবাহে (উদাহরণস্বরূপ, কোনও বিজ্ঞপ্তি থেকে বি বি চালু করা) এটি নাও হতে পারে এবং আপনাকে বি থেকে ক্রিয়াকলাপটি সঠিকভাবে চালু করতে হবে A


11
এখানে অ্যান্ড্রয়েড ডক্সের ব্যাখ্যা, "মানক" এবং "সিঙ্গেল টপ" মোডগুলি একে অপরের থেকে কেবলমাত্র একটি ক্ষেত্রে আলাদা হয়: প্রতিবার "মানক" ক্রিয়াকলাপের জন্য কোনও নতুন অভিপ্রায় উপস্থিত থাকলে শ্রেণীর একটি নতুন উদাহরণ তৈরি হয়ে যায় যার প্রতিক্রিয়া জানাতে যে অভিপ্রায়। প্রতিটি উদাহরণ একক অভিপ্রায় পরিচালনা করে। একইভাবে, একটি নতুন অভিপ্রায় পরিচালনা করতে একটি "সিঙ্গেলপ" ক্রিয়াকলাপের একটি নতুন উদাহরণও তৈরি করা যেতে পারে। যাইহোক, যদি লক্ষ্য টাস্কটির ইতিমধ্যে তার স্ট্যাকের শীর্ষে ক্রিয়াকলাপের একটি বিদ্যমান উদাহরণ রয়েছে, তবে সেই উদাহরণটি নতুন অভিপ্রায়টি গ্রহণ করবে (একটি অন্নইন্টেন্ট () কল); একটি নতুন উদাহরণ তৈরি করা হয় না।
কেপিএসফু

নোট করুন যে ডকুমেন্টেশন অনুসারে navigateUpFromSameTask(...)যুক্ত FLAG_ACTIVITY_CLEAR_TOPকরা উচিত upIntent( navigateUpTo(...)যার মাধ্যমে একই আচরণের ফলাফল হওয়া উচিত ( এই গাইড অনুযায়ী )) তবে পতাকাটি কখনই সেট করা হয় না - এবং এই উত্তরটি
অর্থবোধ করে

82

আপডেট উত্তর: আপ নেভিগেশন ডিজাইন

প্রতিটি ক্রিয়াকলাপের জন্য উপযুক্ত ক্রিয়াকলাপটি আপনাকে অবশ্যই ঘোষণা করতে হবে। এটি করার ফলে সিস্টেমটিকে আপের মতো নেভিগেশন প্যাটার্নগুলি সহজতর করার সুযোগ দেয় কারণ সিস্টেমটি ম্যানিফেস্ট ফাইল থেকে লজিক্যাল প্যারেন্ট ক্রিয়াকলাপ নির্ধারণ করতে পারে।

সুতরাং এর জন্য আপনাকে বৈশিষ্ট্যযুক্ত ট্যাগ কার্যকলাপে আপনার পিতামাতার ক্রিয়াকলাপটি ঘোষণা করতে হবে declare

android:parentActivityName

ভালো লেগেছে,

<!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.app_name.A" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name=".B"
        android:label="B"
        android:parentActivityName="com.example.app_name.A" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
    </activity>

অভিভাবক ক্রিয়াকলাপটি এভাবে ঘোষিত হওয়ার সাথে সাথে আপনি নীচের মতো উপযুক্ত পিতামাতায় নেভিগেট করতে পারেন,

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

সুতরাং আপনি যখন NavUtils.navigateUpFromSameTask(this);এই পদ্ধতিটি কল করেন , এটি বর্তমান ক্রিয়াকলাপ শেষ করে এবং উপযুক্ত পিতামাতার ক্রিয়াকলাপটি শুরু করে (বা পুনরায় শুরু করে)। যদি লক্ষ্য পিতামাতার ক্রিয়াকলাপটি টাস্কের পিছনে থাকে তবে এটি দ্বারা সংজ্ঞায়িত হিসাবে সামনে আনা হয় FLAG_ACTIVITY_CLEAR_TOP

এবং আপ বোতামটি প্রদর্শন করতে আপনাকে ঘোষণা করতে হবে setDisplayHomeAsUpEnabled():

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

পুরানো উত্তর: (উপরে নেভিগেশন ছাড়াই, ডিফল্ট পিছনে নেভিগেশন)

এটি কেবল তখনই ঘটে যখন আপনি ক্রিয়াকলতা বি থেকে আবার ক্রিয়াকলাপ A শুরু করছেন if

ব্যবহার startActivity()

কার্যকলাপকে কার্যকলাপ শুরু করুন বি থেকে এই পরিবর্তে ব্যবহার startActivityForResult()এবং ওভাররাইড onActivtyResult()ভ্রমণ উ মধ্যে

ক্রিয়াকলাপীতে এখন কেবল finish()বোতামে কল করুন। সুতরাং এখন আপনি onActivityResult()আবার কার্যকলাপ A তৈরি না করেই ক্রিয়াকলাপ A এর দিকে পরিচালিত করেছেন ..


আমি জানি না যে ক্রিয়াকলাপে স্টার্টঅ্যাক্টিভিটি () কে বলা হয়। আমি ক্রিয়াকলাপের সোর্স কোড পোস্ট করেছি ...
আশিকাকা

18
কোড লাইন পরিবর্তে NavUtils.navigateUpFromSameTask(this); লিখুন finish()
ব্যবহারকারী370305

4
এটি প্রশ্ন উত্থাপন করে, কীভাবে গুগল নেভিগেশন ( ডেভেলপার.অ্যান্ড্রয়েড / ডিজাইন / পাটারস / ন্যাভিগেশন html ) সম্পর্কে finish()বা startActivityForResult()তাদের ডকুমেন্টেশনে কিছু উল্লেখ করে না ?
তারযুক্ত 00

এটি শ্রমসাধ্য কাজের মতো শোনাচ্ছে। @ লরেঞ্জসিকে উত্তরটি আরও ভাল বলে মনে হচ্ছে।
কারম্যান_মিনিচ

NavUtils.navigateUpFromSameTask (এটি) ব্যবহার করার জন্য অনেক ধন্যবাদ। বড় প্লাস! আমি ফিনিস () ফিন্স প্রতিস্থাপনের জন্য এমন একটি পদ্ধতি খুঁজছি যা কিছু পরিস্থিতিতে পিতামাতার ক্রিয়াকলাপে ফিরে আসে না। ফিনিস () মূলত পূর্বের ক্রিয়াকলাপে ফিরে যাচ্ছে যা অগত্যা পিতামাতার ক্রিয়াকলাপ নয়।
হংকং

22

আমার একই সেটআপটি একই অযাচিত আচরণের দিকে পরিচালিত করেছিল। আমার জন্য এটি কাজ করেছে: Manifest.xmlআমার অ্যাপ্লিকেশনটির একটি ক্রিয়াকলাপ এটিতে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করুন:

android:launchMode="singleTask"

আরও ব্যাখ্যা জন্য এই নিবন্ধটি দেখুন ।


1
আমার দৃষ্টিকোণ থেকে সমস্যার সঠিক সমাধান। এটি কাজটি স্ট্যাকের মধ্যে ক্রিয়াকলাপ বিদ্যমান থাকলে আপনি ফিনিশ () বলা হলে ঠিক এটি আচরণ করবে। যদি এটি না হয় তবে এটি তৈরি এবং শুরু করা হবে।
জোহান

5
এটি সঠিক উপায়ে নয় কারণ এটি অকারণে একটি নতুন কাজ তৈরি করবে, আপনার পরিবর্তে লঞ্চমোড = "সিঙ্গলটপ" ব্যবহার করা উচিত।
কেপিএসফু

19

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

public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
    Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
  } else {
    NavUtils.navigateUpTo(this, upIntent);
  }
}

[ https://stackoverflow.com/a/31350642/570168 ]

তবে আরও দেখুন: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navication-on-android


7

এটি অর্জনের আরও ভাল উপায় হ'ল দুটি জিনিস ব্যবহার করে: কল করুন:

NavUtils.navigateUpFromSameTask(this);

এখন এটি কাজ করার জন্য, আপনার প্রকাশিত ফাইলটি থাকা দরকার যে ক্রিয়াকলাপ এ এর ​​পিতামাতার ক্রিয়াকলাপ বি রয়েছে The পিতামাতার ক্রিয়াকলাপের কোনও প্রয়োজন নেই। সংস্করণ 4 এবং তারপরে আপনি কোনও অতিরিক্ত প্রচেষ্টা ছাড়াই একটি দুর্দান্ত পিছনের তীর পাবেন (এটি একটি ছোট কোডের সাথে নিম্ন সংস্করণেও করা যেতে পারে, আমি এটি নীচে রেখে দেব) আপনি ম্যানিফেস্ট-> অ্যাপ্লিকেশন ট্যাবে এই ডেটা সেট করতে পারেন জিইউআইতে (পিতামাতার ক্রিয়াকলাপের নামটি নীচে স্ক্রোল করুন এবং এটিকে হাতে রেখে দিন)

সমর্থন নোড:

আপনি যদি সংস্করণ 4 এর নীচে সংস্করণটি সমর্থন করতে চান তবে আপনাকে মেটাডেটাও অন্তর্ভুক্ত করতে হবে। ক্রিয়াকলাপটিতে ডান ক্লিক করুন, যোগ করুন> মেটা ডেটা, নাম = android.support.PARENT_ACTIVITY এবং মান = আপনার.ফুল.এ্যাকটিভিটি.নাম

নিম্ন সংস্করণেও দুর্দান্ত তীর পেতে:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

দয়া করে মনে রাখবেন আপনার এই সমস্ত কাজ করার জন্য লাইব্রেরি সংস্করণ 7 সমর্থন করা দরকার তবে এটি খুব ভাল!


5

আমার জন্য যা কাজ করেছে তা যুক্ত করা হচ্ছিল:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onBackPressed() {
        finish();
    }

থেকে TheRelevantActivity.javaএবং এখনই এটিকে আশানুরূপ কাজ করছে তা

এবং হ্যাঁ যোগ করতে ভুলবেন না:

getSupportActionbar.setDisplayHomeAsUpEnabled(true);মধ্যে onCreate()পদ্ধতি


4

আমি চেষ্টা করেছি android:launchMode="singleTask", কিন্তু তাতে কোন লাভ হয়নি। ব্যবহার করে আমার জন্য কাজ করেছেনandroid:launchMode="singleInstance"


অ্যান্ড্রয়েড যুক্ত করা: লঞ্চমোড = "এককক্ষেত্র" পিতামাতার ক্রিয়াকলাপটি আমার জন্য সমস্যার সমাধান করেছে
আমির

4

@ লরেন সি কে এর উত্তর যোগ করা, পরিবর্তন

NavUtils.navigateUpFromSameTask(this);

নীচের কোডে যদি আপনার ক্রিয়াকলাপ অন্য ক্রিয়াকলাপ থেকে শুরু করা যায় এবং এটি অন্য কোনও অ্যাপ্লিকেশন দ্বারা শুরু করা কার্যের অংশ হতে পারে

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
            .addNextIntentWithParentStack(upIntent)
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

এটি একটি নতুন কাজ শুরু করবে এবং আপনার ক্রিয়াকলাপের পিতামাতার ক্রিয়াকলাপটি শুরু করবে যা আপনি ম্যানিফেস্টে ন্যূনতম এসডিকে সংস্করণ <= 15 এর নীচের মতো নির্ধারণ করতে পারবেন

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />

অথবা parentActivityNameএর> 15 ব্যবহার করে


দ্রষ্টব্য: parentActivityNameএসডিকে> 15 এর জন্য ঘোষণা করুন নাহলে এটি আপনাকে কিছু এলোমেলো ক্র্যাশ দেবে
সৌরভ

3

খারাপ অভিভাবকের ক্রিয়াকলাপের নাম সহ অ্যান্ড্রয়েড 5.0 ব্যবহার করতে আমার একই সমস্যা হয়েছিল

<activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>

আমি প্যারেন্ট ক্রিয়াকলাপের নাম থেকে com.example.myfirstapp সরিয়েছি এবং এটি সঠিকভাবে কাজ করেছে


2

গুণাবলী সহ আপনার ক্রিয়াকলাপের তথ্যগুলিতে যুক্ত করুন

android:launchMode="singleTask"

আমার জন্য ভাল কাজ করছে


1
সম্পূর্ণ প্রবাহটি হ'ল @ ওভারশাইড পাবলিক বুলিয়ান অনঅ্যাপশনস আইটেমসিলিগ্রেটেড (মেনু আইটেম আইটেম) {স্যুইচ (আইটেম.জেট আইটেম আইডি ()) {কেস অ্যান্ড্রয়েড.আর.আইডি.হোম: নাভ ইউটিলেস.নভিগেটআপ ফ্রমসেমটাস্ক (এটি); সত্য প্রত্যাবর্তন; super সুপার.অনশনগুলি আইটেমসিলেক্ট (আইটেম) ফিরিয়ে দিন; }
প্রদীশ কুমার

আপনার মেন্যিস্টে <ক্রিয়াকলাপ অ্যান্ড্রয়েড: নাম = "যোগ করুন Mainআরএকটিভিটি" অ্যান্ড্রয়েড: লেবেল = "@ স্ট্রিং / শিরোনাম_অ্যাক্টিভিটি_মাইন"> </activity> <ক্রিয়াকলাপ অ্যান্ড্রয়েড: নাম = "। ক্রিয়েটইভেন্টিভিটি" অ্যান্ড্রয়েড: লেবেল = "@ স্ট্রিং / শিরোনাম_অ্যাক্টিভিটি_ক্রিয়েট_ভেন্য্ট" অ্যান্ড্রয়েড : লঞ্চমোড = "সিঙ্গেল টাস্ক" অ্যান্ড্রয়েড: প্যারেন্টএকটিভিটিনেম = "। মাইনঅ্যাক্টিভিটি"> <মেটা-ডেটা অ্যান্ড্রয়েড: নাম = "অ্যান্ড্রয়েড.সপोर्ट.এআরপিএসিটিভিটি" অ্যান্ড্রয়েড: মান = "। প্রধানঅ্যাক্টিভিটি" /> </activity>
প্রদীশ কুমার

2

জাভা ক্লাসে: -

    toolbar = (Toolbar) findViewById(R.id.apptool_bar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setTitle("Snapdeal");

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

প্রকাশে: -

<activity
            android:name=".SubActivity"
            android:label="@string/title_activity_sub"
            android:theme="@style/AppTheme" >
            <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data>
    </activity>

এটা তোমাকে সাহায্য করবে


1
    @Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
    case android.R.id.home:
        finish();
        return true;
}
return super.onOptionsItemSelected(item);

একটি পিছনে প্রেস মত


1

এটা চেষ্টা কর:

Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
    intent = getIntent();   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}  

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpTo(this,intent);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

0

আমার প্রকাশ্যে android:launchMode="singleTop"যেতে এবং ক্রিয়াকলাপে যুক্ত হওয়া আমার পক্ষে কৌশলটি করেছে।

এটি বিশেষত আমার সমস্যার সমাধান করেছে কারণ আমি Upসরঞ্জামদণ্ডে বোতামটি চাপার পরে অ্যান্ড্রয়েড আগের ক্রিয়াকলাপের একটি নতুন উদাহরণ তৈরি করতে চাইনি - পরিবর্তে নেভিগেশন শ্রেণিবিন্যাসের সময় আমি পূর্বের ক্রিয়াকলাপের বিদ্যমান উদাহরণটি ব্যবহার করতে চেয়েছিলাম।

তথ্যসূত্র: অ্যান্ড্রয়েড: লঞ্চমোড


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