গভীর ঘৃণ্য স্ট্যাক ছেড়ে যাওয়ার সময় ফ্রেগমেন্ট ব্যাক স্ট্যাকটি পরিষ্কার করার কি এটি সঠিক উপায়?


130

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

বামে নির্বাচন ফলকে আমার কাছে 5 টি নির্বাচনযোগ্য আইটেম রয়েছে - A B C D E

প্রতিটি FragmentTransaction:replaceবিবরণ ফলকে একটি খণ্ড (মাধ্যমে ) লোড করে -a b c d e

এখন আমি টুকরোটি প্রসারিত করেছি eযাতে একটি বোতাম রয়েছে যা e1বিশদ বিবরণে অন্য একটি খণ্ড লোড করে দেয় contain আমি eখন্ডের অনক্লিক পদ্ধতিতে এটি করেছি :

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

আমি যদি নিম্নলিখিত নির্বাচনগুলি করি:

E - e - e1 - D - E

তারপরে খণ্ডটি eবিশদ ফলকে রয়েছে। এটি ঠিক আছে এবং আমি যা চাই যাইহোক, আমি যদি backএই মুহুর্তে বোতামটি আঘাত করি তবে এটি কিছুই করে না। আমাকে এটিতে দুবার ক্লিক করতে হবে কারণ e1এখনও স্ট্যাকের মধ্যে রয়েছে। কাছাকাছি ক্লিক করার পরে আমি অনক্রিটভিউতে একটি নাল পয়েন্টার ব্যতিক্রম পেয়েছি:

এই সমস্যাটি 'সমাধান' করতে আমি যখনই A B C D Eনির্বাচিত হয় তখন নিম্নলিখিতগুলি যুক্ত করেছিলাম :

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

কেবল ভাবছেন যে এটি সঠিক সমাধান বা আমার কিছু আলাদা করা উচিত কিনা?

উত্তর:


252

উদ্দেশ্যমূলক আচরণের উপর নির্ভর করে এ বিষয়ে আরও কয়েকটি উপায় অবলম্বন করা যায় তবে এই লিঙ্কটি আপনাকে সর্বোত্তম সমাধান দেয় এবং আশ্চর্যরূপে ডায়ান হ্যাকোবারের নয়

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

মূলত আপনার নিম্নলিখিত বিকল্পগুলি রয়েছে

  • আপনার প্রাথমিক ব্যাক স্ট্যাকের অবস্থার জন্য একটি নাম ব্যবহার করুন এবং ব্যবহার করুন FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
  • পিছনে স্ট্যাকের প্রথম প্রবেশের আইডি পুনরুদ্ধার করতে FragmentManager.getBackStackEntryCount()/ ব্যবহার করুন getBackStackEntryAt().getId()এবং FragmentManager.popBackStack(int id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
  • FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) পুরো ব্যাক স্ট্যাকটি পপ করার কথা ... আমি মনে করি এটির জন্য ডকুমেন্টেশনটি কেবল ভুল। (প্রকৃতপক্ষে আমি অনুমান করি যে এটি আপনি যেখানে প্রবেশ করবেন কেবল এটি কভার করে না POP_BACK_STACK_INCLUSIVE),

এটার মানে কি? ফ্রেগমেন্টম্যানেজ.জেটব্যাকস্ট্যাকএন্ট্রি অ্যাকাউন্ট () / getBackStackEntryAt ()। GetId ()
ড্যানইরো

4
2 য় আমার জন্য কাজ। পুরো স্ট্যাকটি সাফ করার জন্য এর অর্থ: getSupportFragmentManager () .পপব্যাকস্ট্যাক (getSupportFragmentManager ()
নিকল

পপব্যাকস্ট্যাকের পরে @ জোর্জেগার্চিয়া এটি সম্ভব, আমরা কেবল পুরানোটি পুনরায় আরম্ভ না করেই আমাদের খণ্ডটি শেষ করি।
duggu

দয়া করে মনে রাখবেন যে পপব্যাকস্ট্যাক () সংস্করণটি হ'ল পপব্যাকস্ট্যাকআইমিডিয়েট () সংস্করণটি হ'ল অ্যাসিঙ্ক, যার অর্থ আপনি যে পদ্ধতিটি কল করবেন ঠিক সেই মুহুর্তে ক্লিয়ারিংটি ঘটে না।
Genc

6
গ্রুপটিকে স্প্যাম হিসাবে নিষিদ্ধ করা হয়েছে এবং আমি লিঙ্কটি অ্যাক্সেস করতে পারি না দাবি করে :( অন্য কারও কাছে কি এই সংস্থান রয়েছে?
এপিকপান্ডাফোরস

61

আপনি যদি সমস্ত স্ট্যাক এন্ট্রি পপ করতে না চান তবে অন্য পরিষ্কার সমাধান ...

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().replace(R.id.home_activity_container, fragmentInstance).addToBackStack(null).commit();

এটি প্রথমে স্ট্যাকটি পরিষ্কার করবে এবং তারপরে একটি নতুন টুকরা লোড করবে, সুতরাং যে কোনও বিন্দুতে আপনার কাছে স্ট্যাকের মধ্যে কেবলমাত্র একক টুকরো থাকবে


1
এই খুব খারাপ getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);() আগে একটি প্রতিস্থাপন কারণ অসম্পূর্ণ অংশ কলিং লোড করা হচ্ছে onCreateView(), onActivityCreated()ইত্যাদি পুনরুদ্ধার করা হচ্ছে এবং Destroing একটি টুকরা সঙ্গে সঙ্গে খারাপ। খণ্ডটি উদাহরণ হিসাবে একটি রিসিভার নিবন্ধন করতে পারে। এটি পারফরম্যান্সকে প্রভাবিত করে।
ভ্যাসিলিমে

@ বাসিলম, আপনি কি বিশদে বর্ণনা করতে পারবেন? কোন ক্ষেত্রে এটি খারাপ? এটা কি অ্যাসিন্রোনাস আচরণের কারণে FragmentTransaction? ভুল খণ্ড স্ট্যাকের শুধুমাত্র খারাপ অভিনয় আছে?
কুলমাইন্ড

27

জোয়াকিম উত্তরের জন্য ধন্যবাদ , আমি শেষ পর্যন্ত সমস্ত ব্যাক স্ট্যাক এন্ট্রি সাফ করার জন্য কোডটি ব্যবহার করি।

// In your FragmentActivity use getSupprotFragmentManager() to get the FragmentManager.

// Clear all back stack.
int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < backStackCount; i++) {

    // Get the back stack fragment id.
    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();

    getSupportFragmentManager().popBackStack(backStackId, 
        FragmentManager.POP_BACK_STACK_INCLUSIVE);

} /* end of for */

18
এখানে কেন একটি লুপ ব্যবহার করবেন? আমার জন্য ফ্রেগমেন্টম্যানজ.আর.পপব্যাকস্ট্যাক (নাল, ফ্রেগমেন্টম্যানেজ.পি.পি.প্যাক_বিএসিপিপিএকি.সি.সি.এস.সি) সমস্ত ব্যাক স্ট্যাক এন্ট্রি সাফ করেছে ...
মেরেক

3
@ মারেক, কারণ কখনও কখনও সমস্ত টুকরো অপসারণ করা উচিত নয়, এর জন্য একটি লুপ উপযুক্ত।
কুলমাইন্ড

1
কুলমাইন্ড, এটি এখনও আমার কাছে বোধগম্য নয়। popBackStack(backStackId, INCLUSIVE)সমস্ত টুকরো টুকরো (স্টেটস) ব্যাকস্ট্যাক আইডিতে ফিরে যাবে, সুতরাং আপনি একবারে iযে পপ করতে চলেছেন সর্বনিম্ন পপ করলে সমস্ত উচ্চতর স্থান একই সাথে পপ করা উচিত। সুতরাং একটি লুপ এর পয়েন্ট কি?
LarsH

@ লার্শ, আপনি ঠিক বলেছেন স্ট্যাকওভারফ্লো . com/a/59158254/2914140 দেখুন । অন্যান্য টুকরোগুলিকে প্রয়োজনীয় ট্যাগে পপ করার জন্য, আমাদের প্রথমে অ্যাডটোব্যাকস্ট্যাক ( ট্যাগ ) দিয়ে খণ্ড যুক্ত করা উচিত ।
কুলমাইন্ড

7

আমি ব্যাকস্ট্যাক পরিষ্কার করার জন্য অনেক গবেষণা করেছি এবং অবশেষে লেনদেন ব্যাকস্ট্যাক এবং এর পরিচালনা দেখুন । এখানে সমাধানটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে।

 // CLEAR BACK STACK.
    private void clearBackStack() {
        final FragmentManager fragmentManager = getSupportFragmentManager();
        while (fragmentManager.getBackStackEntryCount() != 0) {
            fragmentManager.popBackStackImmediate();
        }
    }

উপরের পদ্ধতিটি ব্যাকস্ট্যাকের সমস্ত লেনদেনের উপরে লুপ করে এবং একবারে একবারে সেগুলি সরিয়ে দেয়।

দ্রষ্টব্য: উপরের কোডটি কিছু সময় কাজ করে না এবং এই কোডের কারণে আমি এএনআর এর মুখোমুখি , সুতরাং দয়া করে এটি চেষ্টা করবেন না।

নীচের আপডেটের পদ্ধতিটি "নাম" এর সমস্ত ঝাঁকুনিটিকে ব্যাকস্ট্যাক থেকে সরান।

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack("name",FragmentManager.POP_BACK_STACK_INCLUSIVE);
  • নাম যদি নন-নাল হয়, তবে এটি সন্ধান করার জন্য পূর্ববর্তী পিছনের অবস্থার নাম; যদি পাওয়া যায় তবে সেই রাজ্য পর্যন্ত সমস্ত রাজ্য পপ হবে। দ্য
  • নামধারী রাষ্ট্রটি নিজেই পপ করা হয়েছে কিনা তা নিয়ন্ত্রণ করতে POP_BACK_STACK_INCLUSIVE পতাকা ব্যবহার করা যেতে পারে। যদি নাল হয় তবে কেবল শীর্ষস্থানীয় রাষ্ট্রটি পপড।

আপনি একবারে কেন সেগুলি সরিয়ে ফেলবেন তা আমি দেখতে পাচ্ছি না। আপনি অন্যান্য সমাধানের পরিবর্তে এই সমাধানটি বেছে নেওয়ার কোনও কারণ আছে কি? একবারে একবারে সব পরিবর্তে একবারে সেগুলি সরিয়ে দেওয়ার কোনও কারণ আছে কি?
miva2

একসময় ব্যাকস্ট্যাক অপসারণ করার কোনও পদ্ধতিতে থায়ার নেই বিকাশকারী
লোকেশ

3

আমি তাদের মতো একটি অনুরূপ কোড ব্যবহার করছি যা সময় লুপটি ব্যবহার করে তবে আমি প্রতিটি লুপে এন্ট্রি গণনা কল করি ... সুতরাং আমি মনে করি এটি কিছুটা ধীর

FragmentManager manager = getFragmentManager();
while (manager.getBackStackEntryCount() > 0){
        manager.popBackStackImmediate();
    }

0

হিসাবে লেখা কিভাবে backstack বন্ধ টুকরা পপ এবং দ্বারা LarsH এখানে, আমরা specifical ট্যাগে উপরে নিচে (কয়েকটি টুকরা পপ করতে একসঙ্গে বাঁধা টুকরা সঙ্গে ) এই পদ্ধতি ব্যবহার করে:

fragmentManager?.popBackStack ("frag", FragmentManager.POP_BACK_STACK_INCLUSIVE);

আপনার টুকরাটির ট্যাগ সহ "টুকরা" প্রতিস্থাপন করুন। মনে রাখবেন যে প্রথমে আমাদের সাথে এই অংশটি ব্যাকস্ট্যাকে যুক্ত করা উচিত:

fragmentTransaction.addToBackStack("frag")

যদি আমরা এর সাথে টুকরো যোগ করি তবে আমরা টুকরো টুকরোটি addToBackStack(null)পপ করব না।


-4
    // pop back stack all the way
    final FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
    int entryCount = fm.getBackStackEntryCount(); 
    while (entryCount-- > 0) {
        fm.popBackStack();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.