अशक्त पैरामीटर के साथ addToBackStack का अर्थ क्या है?


93

मेरे पास एक ग्राहक कोड है। सभी अंशों के लिए केवल एक गतिविधि है अर्थात एकल गतिविधि सभी अंशों का प्रबंधन कर रही है।

इस गतिविधि में उस टुकड़े की विधि के अंत में किसी भी टुकड़े के लिए निम्न कोड होता है-

उदाहरण के लिए - टुकड़ा

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

इसलिए,

1) addToBackStack(null)a के बाद का अर्थ क्या है commit()?

2) आपको एक अशक्त पैरामीटर पास करने की आवश्यकता क्यों है addToBackStack?

3) इस तरह से जोड़े जाने के बाद उस टुकड़े को कैसे प्राप्त करें?

इस कोड की तरह लगता है बेकार है क्योंकि मैं अंतिम पंक्ति के बिना कोड चला गया .addToBackStack(null).commit()और यह बिना किसी समस्या के भाग गया।


developer.android.com/reference/android/app/… कुछ मामलों में आपको उस विधि को कॉल करना होगा।
लूसिफ़ेर


3
आप खंड के नाम को Null के बजाय AddToBackStack (नाम) के पैरामीटर के रूप में पास कर सकते हैं। यदि आप Null पास करते हैं तो आप FragmentManager.popBackStackImmediate (स्ट्रिंग नाम, int झंडे) विधि का उपयोग करने में सक्षम नहीं होंगे; या popBackStack (स्ट्रिंग नाम, int झंडे); क्योंकि नाम नल था। तो popBackstack तरीके काम नहीं करेंगे। मेरा सुझाव है कि आप फ़्रेग्मेंट नाम को पास करने की बजाय अशक्त मान लें।
सौभाग्यशाली

जवाबों:


111

AddToBackStack (null) का अर्थ क्या है?

कोटेशन डॉक्स:

AddToBackStack () को कॉल करके, बदले हुए लेन-देन को बैक स्टैक में सहेजा जाता है ताकि उपयोगकर्ता लेनदेन को उलट सके और पिछला बटन दबाकर पिछला टुकड़ा वापस ला सके।

यदि आप लेन-देन में कई परिवर्तन जोड़ते हैं (जैसे कि कोई अन्य जोड़ें () या निकालें) उन सभी को एक साथ उलट देगा।

जिस क्रम में आप एक FragmentTransaction में परिवर्तन जोड़ते हैं, उसके अलावा कोई फर्क नहीं पड़ता:

आपको commit()अंतिम कॉल करना होगा । यदि आप एक ही कंटेनर में कई टुकड़े जोड़ रहे हैं, तो आप जिस क्रम में उन्हें जोड़ते हैं वह दृश्य पदानुक्रम में दिखाई देने वाले क्रम को निर्धारित करता है।

तो आपको सबसे आखिर में कमिट करना है।

आपको AddToBackStack के लिए एक अशक्त पैरामीटर पास करने की आवश्यकता क्यों है?

यह अशक्त होने की जरूरत नहीं है, यह एक स्ट्रिंग हो सकता है। यदि आप नहीं चाहते हैं, तो बस अशक्त हो।

सार्वजनिक सार FragmentTransaction addToBackStack (स्ट्रिंग नाम)

एपीआई स्तर 11 में जोड़ा गया इस लेनदेन को बैक स्टैक में जोड़ें। इसका मतलब यह है कि लेनदेन को प्रतिबद्ध होने के बाद याद किया जाएगा, और बाद में स्टैक से पॉपअप होने पर अपने ऑपरेशन को उलट देगा।

पैरामीटर का नाम इस बैक स्टैक स्थिति या नल के लिए एक वैकल्पिक नाम है।

के विषय में:

इस कोड की तरह लगता है कि बेकार है क्योंकि मैं अंतिम पंक्ति के बिना कोड चला रहा हूँ .addToBackStack (null) .commit ()

यदि आप पिछले टुकड़े पर नेविगेट करना चाहते हैं, तो इसे बैकस्ट में जोड़ें। तो यह इस बात पर निर्भर करता है कि आप टुकड़े को बैकस्ट में जोड़ना चाहते हैं या नहीं।

इस तरह जोड़े जाने के बाद उस टुकड़े को कैसे प्राप्त किया जाए?

आपके पास पहले से ही खंड का उदाहरण है firstFragment। इसलिए मुझे नहीं पता कि बाद में टुकड़ा मिलने से आपका क्या मतलब है।

अधिक जानकारी @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


आप इसे एपीआई डॉक से अपने उत्तर में भी जोड़ सकते हैं: इस लेनदेन को बैक स्टैक में जोड़ें। इसका मतलब यह है कि लेनदेन को प्रतिबद्ध होने के बाद याद किया जाएगा, और बाद में स्टैक से पॉपअप होने पर अपने ऑपरेशन को उलट देगा। पैरामीटर का नाम इस बैक स्टैक स्थिति या नल के लिए एक वैकल्पिक नाम है।
डायरबॉर्ग

तो जैसा कि मैंने समझा, बैकस्टैक को जोड़ने का पूरा उद्देश्य नेविगेशन प्रदर्शन करना है जैसा कि हम पिछले टुकड़े में जाने के लिए बैक बटन के साथ करते हैं?
माई गॉड

ठीक है तो अगर आप addToBackStack के लिए एक पैरामीटर पास कर रहे हैं तो हमें यह करने की आवश्यकता है कि getFragmentManager().popBackStackImmediate()क्या बैक बटन बस अपने आप से / बिना पैरामीटर पास के कर सकता है? इसका जवाब देखें - stackoverflow.com/questions/21156153/…
मेरा भगवान

@VedPrakash आप की जरूरत नहीं है। यह भी एक अलग सवाल है और पूरी तरह से जवाब है। आप आसानी से अपने आप को दो टुकड़े करके वापस स्टैक में जोड़कर और बैक बटन दबाकर आसानी से पता लगा सकते हैं
रघुनंदन

@ वेदप्रकाश ने प्रबंध अंश पढ़े @ डेवलपर.
रघुनंदन

17

tagमें स्ट्रिंग addToBackStack(String name)वापस ढेर लगाने के लिए बाद में उस स्थान पर सीधे पॉप के लिए एक रास्ता देती है। इसका उपयोग विधि में किया जाना था popToBackStack(String name, int flags):

प्रबंधक के टुकड़े बैक स्टैक से अंतिम टुकड़ा संक्रमण पॉप। यह फ़ंक्शन अतुल्यकालिक है - यह पॉप करने के लिए अनुरोध की पुष्टि करता है, लेकिन जब तक आवेदन अपने इवेंट लूप में वापस नहीं आता, तब तक कार्रवाई नहीं की जाएगी।

नाम: यदि गैर-अशक्त है, तो यह पिछली पीठ की स्थिति का नाम है; अगर पाया जाता है, तो उस राज्य के सभी राज्य पॉप-अप हो जाएंगे। POP_BACK_STACK_INCLUSIVE ध्वज का उपयोग यह नियंत्रित करने के लिए किया जा सकता है कि नामांकित राज्य स्वयं पॉप है। यदि अशक्त, केवल शीर्ष स्थिति पॉप है।

झंडे: या तो 0 या POP_BACK_STACK_INCLUSIVE।

दूसरे शब्दों में, यह अपनी पीठ ढेर पॉप जाएगा जब तक यह टुकड़ा है कि से जोड़ा गया है पाता है nameमें addToBackStack(String name)

उदाहरण के लिए, यदि आप टुकड़ों को जोड़ते हैं या उनके टुकड़े "बदले", "खंड 2", "खंड 3", "खंड 4" के नाम देते हुए खंड प्रबंधक को देते हैं और बाद में सीधे खंड 2 में वापस जाना चाहते हैं, तो addooBackStack (" frag2 "), आप कॉल करें popToBackStack("frag2", 0)

इसलिए,

  • उपयोग करें .addToBackStack("fragName"): यदि आप बाद में popToBackStack(String name, int flags)एक से अधिक स्टैक पॉप करना चाहते हैं ।

  • उपयोग करें .addToBackStack(null): यदि आप बाद में एक से अधिक बैक स्टैक नहीं चाहते हैं, लेकिन फिर भी एक बार में पॉप करना चाहते हैं। भले ही आप popToBackStack () को स्पष्ट रूप से कॉल नहीं करेंगे, लेकिन इसके बजाय बैक प्रेस डिफ़ॉल्ट कार्यान्वयन को बैक स्टैक को संभालने देगा।

  • उपयोग करें .disallowAddToBackStack(): यदि आप या तो बैक प्रेस नहीं चाहते हैं या popBackStack () को स्पष्ट रूप से कहते हैं। यह सुनिश्चित करेगा कि कोड का कोई भी हिस्सा .addToBackStack () का उपयोग नहीं कर रहा है।


1

आपके उत्तर हटा दिए गए हैं। यदि आप टुकड़ों को बैक स्टैक में नहीं जोड़ना चाहते हैं, तो आपको कोड के स्निपेट के नीचे उपयोग करना चाहिए:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

नीचे आपके पास इसका सुंदर उदाहरण है कि इसका उपयोग कैसे करें:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
पदावनत कहाँ? मैं प्रलेखन या FragmentTransaction स्रोत में कुछ भी नहीं देखता।
Rup

3
खबरदार, अगर आप disallowAddToBackStack, तो AddToBackStack के भविष्य के किसी भी कॉल को IllegalStateException फेंक देंगे। यदि addToBackStack को पहले ही कॉल किया जा चुका है, तो यह विधि IllegalStateException को फेंक देगी।
काथिर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.