টুকরা ব্যবহার করে পিছনে স্ট্যাক সাফ করুন


244

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

এখন আমার অ্যাপ্লিকেশনটি একাধিক টুকরা সহ কেবল একটি একক ক্রিয়াকলাপ, তাই আমি হোম বোতাম টিপলে আমি কেবল তার ভিতরে থাকা একটি টুকরো প্রতিস্থাপন করব। আমি কিভাবে ব্যবহার ছাড়াই আমার পিঠ স্ট্যাক পরিষ্কার করতে পারেন startActivityসঙ্গে ACTIVITY_CLEAR_TOPপতাকা?


পিছনে স্ট্যাক ব্যবহার করা এড়িয়ে চলুন! এটি সামগ্রিক দক্ষতার সাথে সত্যই সহায়তা করে না! প্লেইন রিপ্লেজ () ব্যবহার করুন বা প্রতিবার নেভিগেট করতে চাইলে আরও ভাল সরান / যুক্ত করুন! আমার পোস্টে চেক করুন stackoverflow.com/questions/5802141/...
stack_ved

উত্তর:


430

আমি এখানে কিছু অনুরূপ পোস্ট

জোয়াকিমের উত্তর থেকে, ডায়ান হ্যাকোবারের কাছ থেকে:

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

আমি শুধু ব্যবহার করে শেষ করেছি:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}

তবে সমানভাবে এমন কিছু ব্যবহার করতে পারত:

((AppCompatActivity)getContext()).getSupportFragmentManager().popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

যা নামকরা সমস্ত রাজ্যকে পপ করবে। তারপরে আপনি যা চান তার সাথে খণ্ডটি প্রতিস্থাপন করতে পারেন


8
ঠিক আছে, এটি এক বা একাধিকবার পিছনের বোতামটি হিট করার সমতুল্য, তাই এটি বর্তমানে দৃশ্যমান খণ্ডকে পরিবর্তন করে। (কমপক্ষে আমি যখন এটি চেষ্টা করেছি)
পিটার আজতাই

7
আমি পিটার হিসাবে একই সমস্যা হচ্ছে। আমি সমস্ত টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করার পরিবর্তে which উদাহরণস্বরূপ, আপনি লাইফসাইকেল ইভেন্টগুলি হিট করবেন যা আপনার প্রয়োজন নেই ক্রমান্বয়ে স্ট্যাকের প্রতিটি খণ্ডকে পপিং করে।
ব্রায়ান গ্রিফি

233
শীর্ষে যেতে কেবল ব্যবহার করুন: ফ্রেগমেন্টমেনেজ.আর.পপব্যাকস্ট্যাক (নাল, ফ্রেগমেন্টম্যানেজ.পি.পি.পি_বিএসিপিসিপিএসিপিএনসিপিএস);
ওয়ারপজিট

53
ফ্র্যাগমেন্টম্যানেজারটি ব্যবহার করার জন্য এটি মূল্যবান। পপব্যাকস্ট্যাকমিডিয়েট (নাল, ফ্র্যাগমেন্টম্যানেজ। পিওপি_বিএসিপিসিপিএসিপিপিএস); এটি আমার জন্য আরও ভাল কাজ করেছে কারণ এটি খণ্ড অ্যানিমেশনগুলি কার্যকর করতে বাধা দিয়েছে
রোসারস্টার

17
এটি সঠিকভাবে কাজ করে না - এটি মধ্যবর্তী প্রতিটি খণ্ডের অন স্টার্টে কল কল করবে
জেমস

165

@ ওয়ারপজিট এর মন্তব্যের জন্য একটি উত্তর দিতে এবং অন্যের পক্ষে এটি সন্ধান করা সহজ করে।

ব্যবহার করুন:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

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

পপব্যাকস্ট্যাকমিডিয়েট ব্যবহার হতে পারে।
কান্নান_জেজেডি

38

সমস্ত জড়িত পক্ষের প্রতি যথাযথ সম্মান সহ; আপনারা কতজন সরল দিয়ে পুরো খণ্ডটি ব্যাক স্ট্যাক সাফ করতে পারেন তা দেখে আমি খুব অবাক হয়েছি

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

অ্যান্ড্রয়েড ডকুমেন্টেশন অনুসারে ( nameযুক্তি সম্পর্কিত - দাবির কাজের প্রস্তাবগুলিতে "নাল")

যদি নাল হয় তবে কেবল শীর্ষস্থানীয় রাষ্ট্রটি পপড

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

(রেফারেন্সের জন্য, এর সাথে কিছু)

FragmentManager fm = getFragmentManager(); // or 'getSupportFragmentManager();'
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {    
    fm.popBackStack();
}

4
আমার জন্য এটি ছিল না যেহেতু প্রতিটি পপ আপনাকে প্রতিটি খণ্ডের অনক্রিটভিউতে অভ্যন্তরীণভাবে নিয়ে যায় । যেখানে আমি কোনও সংস্থানে একটি এনপিই পেতে পারি। তবে এফএম.পপব্যাকস্ট্যাক (নাল, ফ্র্যাগমেন্টম্যানেজার। কেবল সমস্ত পিছন পিছনে হত্যা।
Sud007

1
লুপ ব্যবহার করে পপিং করার সময় কীভাবে অনক্রিট ভিউ কলগুলি এড়ানো যায় তার কোনও অন্তর্দৃষ্টি?
আয়ুশ গোয়েল

উপরের সর্বাধিক টুকরা (নাল) সাফ করা পিছনের স্ট্যাকের পরে আসা সমস্ত টুকরোগুলি সাফ করবে।
2b77bee6-5445-4c77-b1eb-4df3e5

18

লুপ ব্যবহার না করে আমার পক্ষে এবং সহজ উপায়ে কাজ করে:

 FragmentManager fragmentManager = getSupportFragmentManager();
 //this will clear the back stack and displays no animation on the screen
 fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

17

গৃহীত উত্তর আমার পক্ষে যথেষ্ট ছিল না। আমাকে ব্যবহার করতে হয়েছিল:

FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStackImmediate();
}

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

16

লুপ ছাড়াই ব্যাকস্ট্যাক সাফ করুন

String name = getSupportFragmentManager().getBackStackEntryAt(0).getName();
getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);

যেখানে নামটি অ্যাডটোব্যাকস্ট্যাক () প্যারামিটার

getSupportFragmentManager().beginTransaction().
                .replace(R.id.container, fragments.get(titleCode))
                .addToBackStack(name)

এমনকি যদি আপনি প্রতিস্থাপন করেন তবে ফ্রেমমেন্ট স্ট্যাকটি জীবিত তবে দৃশ্যমান নয়
অ্যাজমে

8

আমি কেবল যুক্ত করতে চেয়েছিলাম: -

নিম্নলিখিতটি ব্যবহার করে ব্যাকস্ট্যাক থেকে বেরিয়ে আসা

fragmentManager.popBackStack ()

কেবলমাত্র লেনদেন থেকে টুকরো টুকরো টুকরো টুকরো টুকিটাকি সরানো, কোনওভাবেই এটি পর্দা থেকে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টিকানো সুতরাং আদর্শভাবে, এটি আপনার কাছে দৃশ্যমান নাও হতে পারে তবে একে অপরের উপর সজ্জিত দুটি বা তিনটি টুকরো থাকতে পারে এবং পিছনের কী টিপে ইউআই দেখতে বিশৃঙ্খল, স্তুপীকৃত দেখাতে পারে।

কেবল একটি সাধারণ উদাহরণ গ্রহণ: -

ধরুন আপনার একটি খণ্ড রয়েছে যা এই ট্রানজেকশনটি সংরক্ষণ করার জন্য ফ্রেগমেট বি লোড করে ফ্রেমমেন্টম্যানেজ.রেপ্লেস () ব্যবহার করে এবং তারপরে আমরা অ্যাডটোব্যাকস্ট্যাক করি। সুতরাং প্রবাহটি হ'ল: -

পদক্ষেপ 1 -> ফ্রেগমেন্টএ-> ফ্র্যাগমেন্টবি (আমরা ফ্রেগমেন্টবিতে চলে এসেছি, তবে খণ্ড A এ ব্যাকগ্রাউন্ডে রয়েছে, দৃশ্যমান নয়)।

এখন আপনি ফ্র্যাগমেন্ট বি তে কিছু কাজ করেন এবং সেভ বোতামটি টিপুন saving যা সংরক্ষণের পরে আবার খন্ডটিতে ফিরে যেতে হবে।

পদক্ষেপ 2-> ফ্রেগমেন্টবি-এর সংরক্ষণে, আমরা আবার ফ্র্যাগমেন্টএতে ফিরে যাই।

পদক্ষেপ 3 -> সুতরাং সাধারণ ভুলটি হবে ... খণ্ড বিতে, আমরা ফ্র্যাগমেন্টএ'র সাথে ফ্র্যাগমেন্ট ম্যানেজার.রেপ্লেস () ফ্র্যাগমেন্টবি করব।

তবে আসলে কী ঘটছে, আমরা আবার ফ্র্যাগমেন্ট এ লোড করছি, ফ্র্যাগমেন্টবি'র পরিবর্তে। সুতরাং এখন দুটি ফ্রেগমেন্টএ রয়েছে (একটি STEP-1 থেকে এবং একটি এই STEP-3 থেকে)।

টুকরোগুলির দুটি উদাহরণ একে অপরের উপরে সজ্জিত, যা দৃশ্যমান নাও হতে পারে, তবে এটি সেখানে রয়েছে।

সুতরাং আমরা যদি উপরের পদ্ধতিগুলি দ্বারা ব্যাকস্ট্যাকটি সাফ করি, তবে লেনদেনটি সাফ হয়ে গেছে তবে প্রকৃত টুকরা নয়। সুতরাং আদর্শ যেমন একটি বিশেষ ক্ষেত্রে, সংরক্ষণ বাটন টিপে আপনি কেবল fm.popBackStack () বা fm.popBackImedia () করে খণ্ড খণ্ডিতে ফিরে যেতে হবে ।

সুতরাং স্টেটিপি 3-> এফএম.পপব্যাকস্ট্যাক () ফাংশমেন্টএ এ ফিরে যান, যা ইতিমধ্যে স্মৃতিতে রয়েছে।


3

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

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

জিরো ( 0) হ'ল স্ট্যাকের নীচে, সুতরাং এটিতে সমপরিমাণ পপিং স্ট্যাকটি সাফ করে।

ক্যাভেট: যদিও উপরোক্ত আমার প্রোগ্রামটিতে কাজ করে, আমি কিছুটা দ্বিধা বোধ করি কারণ ফ্র্যাগমেন্টম্যানেজার ডকুমেন্টেশন আসলে কখনও বলে না যে আইডিটি স্ট্যাক সূচক index এটি উপলব্ধি করে যে এটি হবে, এবং আমার সমস্ত ডিবাগ লগগুলি এটি ছিল তা বের করে দিয়েছে, তবে সম্ভবত কোনও বিশেষ পরিস্থিতিতে এটি হবে না? কেউ কি একভাবে এই উপায়টি নিশ্চিত করতে পারেন? যদি এটি হয় তবে উপরেরটি সর্বোত্তম সমাধান। যদি না হয় তবে এটি বিকল্প:

while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }

1
fragmentManager..getBackStackEntryAt(0).getId()0 এর পরিবর্তে কীভাবে ব্যবহার করবেন ? ব্যাকস্ট্যাক এন্ট্রি আইডিগুলি স্ট্যাক সূচক থেকে কিছুটা আলাদা হয়ে গেলেও এটি কাজ করা উচিত।
ক্রিস্টোফকে

3

কেবল এই পদ্ধতিটি ব্যবহার করুন এবং প্রসঙ্গ এবং ফ্রেগমেন্ট ট্যাগটি পাস করুন যা আমাদের ব্যাকস্টেক টুকরো অপসারণ করতে হবে।

ব্যবহার

clearFragmentByTag(context, FragmentName.class.getName());



public static void clearFragmentByTag(Context context, String tag) {
    try {
        FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager();

        for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) {
            String backEntry = fm.getBackStackEntryAt(i).getName();
            if (backEntry.equals(tag)) {
                break;
            } else {
                 fm.popBackStack();
            }
        }
    } catch (Exception e) {
        System.out.print("!====Popbackstack error : " + e);
        e.printStackTrace();
    }
}

2

হাই ~ আমি একটি সমাধান পেয়েছি যা থেকে আরও ভাল from https://gist.github.com/ikew0ng/8297033

    /**
 * Remove all entries from the backStack of this fragmentManager.
 *
 * @param fragmentManager the fragmentManager to clear.
 */
private void clearBackStack(FragmentManager fragmentManager) {
    if (fragmentManager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry entry = fragmentManager.getBackStackEntryAt(0);
        fragmentManager.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

2
কেন এই সমাধানটি আরও ভাল তার সাথে আপনার উত্তরটি প্রসারিত করুন।
সাইমন.এসএ

এটি মেকানিজমটি ব্যবহার করে যা এসডিকে নিজে সরবরাহ করে এবং কিছু এনপি সমস্যা তৈরি করবে না।
চেঙ্কসি

1

আমি এইভাবে এই কাজ পেয়েছি:

public void showHome() {
    getHandler().post(new Runnable() {
        @Override
        public void run() {
            final FragmentManager fm = getSupportFragmentManager();
            while (fm.getBackStackEntryCount() > 0) {
                fm.popBackStackImmediate();
            }
        }
    });
}

1

এটি আমার জন্য কাজ করছে, এটি চেষ্টা করে দেখুন:

public void clearFragmentBackStack() {
        FragmentManager fm = getSupportFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount() - 1; i++) {
            fm.popBackStack();
        }
    }

0
    private void clearBackStack(){
        SupportFragmentManaer fm = getSupportFragmentManager();
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

এই পদ্ধতিতে কলটি খুব ঝরঝরে হবে।

  1. কোনও লুপের প্রয়োজন নেই।
  2. আপনি যদি টুকরাগুলিতে অ্যানিমেশন ব্যবহার করছেন তবে এটি খুব বেশি অ্যানিমেশন প্রদর্শন করবে না। তবে লুপ উইল ব্যবহার করে।

0
private boolean removeFragFromBackStack() {
    try {
        FragmentManager manager = getSupportFragmentManager();
        List<Fragment> fragsList = manager.getFragments();
        if (fragsList.size() == 0) {
            return true;
        }
        manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান এবং এটি ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলে ধরে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
আবদিলিল্লাহ এল আইসাউই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.