जवाबों:
आप एक खंड ID को प्रोग्रामिक रूप से सेट नहीं कर सकते ।
हालांकि, एक है String tag
कि आप FragmentTransaction के अंदर सेट कर सकते हैं जिसका उपयोग विशिष्ट रूप से एक Fragment की पहचान करने के लिए किया जा सकता है।
अलेक्सी के रूप में बताया, तो आप के लिए एक आईडी पारित कर सकते हैं FragmentTransaction
की add(int, Fragment)
विधि। हालाँकि, यह किसी फ़्रैगमेंट के लिए आईडी निर्दिष्ट नहीं करता है। यह में ViewGroup
सम्मिलित करने के लिए एक की आईडी निर्दिष्ट करता है Fragment
। यह उस उद्देश्य के लिए उपयोगी नहीं है जिसकी मुझे अपेक्षा है, क्योंकि यह विशिष्ट रूप से Fragment
एस की पहचान नहीं करता है , लेकिन ViewGroup
एस। ये आईडी कंटेनरों की हैं जिन्हें गतिशील रूप से एक या अधिक टुकड़े जोड़े जा सकते हैं। Fragment
S की पहचान करने के लिए इस तरह की विधि का उपयोग ViewGroup
करने से Fragment
आपको अपने द्वारा सम्मिलित किए गए लेआउट के लिए गतिशील रूप से s जोड़ने की आवश्यकता होगी । यह बहुत बोझिल होगा।
इसलिए यदि आपका सवाल यह है कि आप जिस गतिशील रूप से जोड़ रहे हैं, एक फ़्रैगमेंट के लिए एक विशिष्ट पहचानकर्ता कैसे बनाया जाता है, तो इसका उत्तर है FragmentTransaction
' ऐड कंटेनर (int कंटेनर ViewId , फ़्रैगमेंट टुकड़ा, स्ट्रिंग टैग) विधि और FragmentManager
' खोज ' फ़्रेग्मेंटबैंकटैग (स्ट्रिंग) विधि का उपयोग करें।
मेरे एक ऐप में, मुझे गतिशील रूप से तार उत्पन्न करने के लिए मजबूर किया गया था। लेकिन यह वास्तविक FragmentTransaction, वैसे भी इतना महंगा नहीं है।
टैग विधि का एक अन्य लाभ यह है कि यह एक ऐसे टुकड़े की पहचान कर सकता है जिसे UI में नहीं जोड़ा जा रहा है। FragmentTransaction की देखें ऐड (Fragment, String) विधि देखें। Fragment
s की जरूरत नहीं है View
! उन्हें विन्यास परिवर्तनों के बीच अल्पकालिक स्थिति को बनाए रखने के लिए भी उपयोग किया जा सकता है!
पता चलता है कि आपको खंड आईडी जानने की आवश्यकता नहीं हो सकती है।
डॉक्स से:
public abstract Fragment findFragmentById (int id)
Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.
महत्वपूर्ण हिस्सा "लेन-देन में जोड़े जाने पर कंटेनर आईडी के रूप में" है।
इसलिए:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.fragment_holder, new AwesomeFragment())
.commit();
और फिर
AwesomeFragment awesome = (AwesomeFragment)
getSupportFragmentManager()
.findFragmentById(R.id.fragment_holder);
जो भी (भयानक) टुकड़ा R.id.fragment_holder में आयोजित किया जाता है वह आपको मिलेगा।
ज्यादातर मामलों में आप आईडी के साथ ही टुकड़े टैग का उपयोग कर सकते हैं।
आप में टैग मान सेट कर सकते हैं FragmentTransaction.add(Fragment fragment, String tag );
। फिर आप FragmentManager.findFragmentByTag(String tab)
प्रश्न में टुकड़े को खोजने के लिए कमांड का उपयोग कर सकते हैं ।
जैसा कि टॉम और अन्य पहले से ही उल्लेख करते हैं, एक टुकड़े को टैग लगाने और पहचान के लिए उस टैग का उपयोग करने के तरीके हैं। उन समाधानों के साथ आई एक बाद की समस्या यह है कि जब तक यह गतिविधि (या, वास्तव में, FragmentManager
) के साथ जुड़ा हुआ है तब तक टुकड़े को एक टैग नहीं मिलता है । टैग होने से पहले किसी को एक टुकड़े की पहचान करने की आवश्यकता है तो क्या करें?
मेरे समाधान अब तक सभी दुनिया के सबसे पुराने (जावा) ट्रिक पर भरोसा करते हैं: एक न्यूनतर टेम्प्लेट टुकड़ा बनाएं जो इसके निर्माणकर्ताओं में से एक में एक आईडी लेता है और एक प्रदान करता है getFragmentId()
विधि जो उस आईडी को लौटाता है। मैंने तब उन अंशों को जाने दिया जिनकी प्रारंभिक पहचान की आवश्यकता है, उस टेम्पलेट का विस्तार करें और; देखा! समस्या सुलझ गयी।
यह समाधान, दुर्भाग्य से, टेम्पलेट के टुकड़े के एक सेट की आवश्यकता हो सकती है, प्रत्येक टुकड़े के प्रकार के लिए एक ListFragment
, DialogFragment
या सादे पुराने Fragment
(POFO?) जिन्हें शुरुआती पहचान की आवश्यकता होती है। लेकिन मेरे द्वारा उपलब्ध कराए गए लाभों को देखते हुए, मुझे लगता है कि टुकड़ों के मामले में यह प्रबंधनीय है।
घावों को भरने के लिए क्षमा करें :-)
चीयर्स!
निम्न का उपयोग करें:
एक टुकड़ा जोड़ने के लिए:
getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();
मौजूदा टुकड़े की पहचान करने के लिए:
getFragmentManager().findFragmentByTag(fragmentName);
टैग का उपयोग करते समय कृपया जोड़ना सुनिश्चित करें
fragmentTransaction.addToBackStack(null);
तरीका ऐसा है कि डेवलपर गाइड में बताए अनुसार नष्ट किए जाने के बजाय आपका टुकड़ा फिर से शुरू हो जाता है।
यदि आप किसी खंड को हटाने वाले लेनदेन को AddToBackStack () नहीं कहते हैं, तो लेनदेन के प्रतिबद्ध होने पर वह टुकड़ा नष्ट हो जाता है और उपयोगकर्ता वापस उसमें नेविगेट नहीं कर सकता है। जबकि, यदि आप किसी खंड को हटाते समय AddToBackStack () कॉल करते हैं, तो टुकड़ा बंद हो जाता है और बाद में फिर से शुरू होता है यदि उपयोगकर्ता वापस नेविगेट करता है।
आप इसे इस पृष्ठ के अंत में पा सकते हैं ।
मुझे लगभग 30 मिनटों में यह पता लगाने की कोशिश करनी पड़ी कि एक साधारण findFragmentByTag();
कॉल के जरिए मेरा फ्रैगमेंट क्यों नहीं हो रहा है