एंड्रॉइड फ्रेगमेंट्स: छिपाने का उपयोग कब करें / दिखाएं या जोड़ें / निकालें / बदलें?


117

मान लीजिए कि मैं कुछ कंटेनर दृश्य में वर्तमान टुकड़े को दूसरे के साथ बदलना चाहता हूं। क्या इसका उपयोग करना बेहतर है ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... या निम्नलिखित, दिखाने और छिपाने के साथ?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

क्या ऐसा करने का एक तरीका अधिक कुशल है? इन तरीकों का उपयोग करने के बारे में अधिक जानकारी नहीं मिल सकती है, या वे शामिल किए गए टुकड़ों के जीवनचक्र को कैसे प्रभावित करते हैं। धन्यवाद!


अगर मैं खंड A से टुकड़ा B में जाता हूं और फिर खंड A पर वापस जाता हूं तो मैं यह कैसे सुनिश्चित कर सकता हूं कि जीवन चक्र घटना जैसे onCreateView खंड A पर नहीं है? टैग काम से टुकड़ा मिल रहा है?
ब्लैकहॉक

जवाबों:


135

आपको इस बात पर विचार करना चाहिए कि आप किस मार्ग का अनुसरण करने की योजना बना रहे हैं। यदि आप टुकड़े को छिपाने के लिए एक FragmentTransaction का उपयोग करते हैं, तो यह अभी भी अपने जीवनचक्र की चालू स्थिति में हो सकता है, लेकिन इसकी UI को विंडो से अलग कर दिया गया है, इसलिए यह अब दिखाई नहीं देता है। तो आप तकनीकी रूप से अभी भी खंड के साथ बातचीत कर सकते हैं और इसके यूआई को बाद में आपको रीटच करने की आवश्यकता है। यदि आप टुकड़े को प्रतिस्थापित करते हैं, तो आप वास्तव में इसे कंटेनर से बाहर निकाल रहे हैं और यह जीवनचक्र (ऑनपॉइंट, ऑनटॉप, इत्यादि) में सभी अशांति की घटनाओं से गुजरेगा और यदि किसी कारण से आपको उस टुकड़े को दोबारा बनाने की आवश्यकता होगी इसे वापस कंटेनर में डालें और इसे फिर से अपने सभी आरंभीकरण के माध्यम से चलाने दें।

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


5
हमारी जरूरतों के लिए, टुकड़े को इनिशियलाइज़ करना काफी महंगा है, इसलिए हम शायद साथ जाएँगे hide()और show()उस पर बचत करेंगे! इसके लिए धन्यवाद!
रॉबर्ट कार्ल

2
नमस्ते, जब आप खिड़की से अलग कहते हैं, तो क्या आपका मतलब ऑनडेट () कॉलबैक कहा जाएगा? मैंने ऐसा प्रयोग किया, ऐसा लगता है कि ऐसा नहीं है।
जिंजरजिम

शायद उसका मतलब था "अलग"; एक टुकड़ा भी अलग किया जा सकता है / reattached (इसके अलावा जोड़ने / हटाने, दिखाने / छिपाने के लिए)
आने वाली तारीख

1
@Zainodis, मेरी भी यही समस्या है। मेरा समाधान onSaveInstanceState () - saveInstanceState.putBoolean (STATE_HIDDEN, isHidden ()) में खंड के छिपे हुए राज्य को सहेजना है; उसके बाद onCreate () में यदि (saveInstanceState! = null) छिपा हुआ राज्य वापस मिलता है और यदि टुकड़ा छिपा हुआ है, तो उसे लेनदेन के साथ छिपा दें।
worawee.s

1
@ worawee.s अरे वहाँ और अद्यतन के लिए धन्यवाद :)! मैंने अपने अंत पर थोड़ी देर पहले इस मुद्दे को हल किया - मुझे वास्तव में छिपाने / दिखाने आदि की आवश्यकता नहीं थी, इसलिए मैंने इसे पूरी तरह से गिरा दिया और अब मैं एकल फलक में जोड़ / प्रतिस्थापित या एकल खंड गतिविधियों जैसे मानकों के साथ जा रहा हूं (मूल रूप से मास्टर विस्तार प्रवाह) । अभी भी अपने समाधान को छिपाने के लिए उपयोग करने वालों के लिए वास्तव में उपयोगी होगा - और सहेजे गए जाँच की जाँच नहीं करता! = अशक्त मैं पहले की गई गलतियों में से एक था।
AgentKnopf

5

आपने मूल रूप से खुद को जवाब दिया। यदि आप प्रतिस्थापित करना चाहते हैं (तो पुराने टुकड़े की अब आवश्यकता नहीं है) replace()यदि आप इसे छिपाना चाहते हैं तो उपयोग करें hide()


मूल रूप से प्रतिस्थापित करता है सभी को हटा दें। मैं मिलान छिपाने को नहीं ढूँढ सका :(
AlikElzin-kilaka

@ AlikElzin-kilaka मेरी गतिविधि में तीन टुकड़े में तीन टुकड़े मैं नेटवर्क से डेटा प्राप्त कर रहा हूं जो मुझे किस विधि का पालन करना चाहिए
मानसुख अहीर

0

मैंने अपनी गतिविधि में 4 खंडों के साथ छुपा / शो विधि का उपयोग किया, जिससे मेरा समाधान हल हो गया लेकिन कुछ समय जब मैं अपना संवाद दिखाता हूं तो यह विंडो खराब टोकन अपवाद देता है जब मैंने ऐड और रिप्लेसमेंट विधि का उपयोग किया तो खराब टोकन अपवाद नहीं होता है इसलिए मुझे लगता है कि शो / छिपाने का तरीका सही नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.