Android - सेट खंड आईडी


111

मैं एक Fragment's सेट कैसे कर सकता हूं Idताकि मैं उपयोग कर सकूं getSupportFragmentManager().findFragmentById(R.id.--)?


आप इसे लेआउट xml फ़ाइल में सेट कर सकते हैं
व्लादिमीर Eremeev

जवाबों:


117

आप एक खंड ID को प्रोग्रामिक रूप से सेट नहीं कर सकते

हालांकि, एक है String tagकि आप FragmentTransaction के अंदर सेट कर सकते हैं जिसका उपयोग विशिष्ट रूप से एक Fragment की पहचान करने के लिए किया जा सकता है।

अलेक्सी के रूप में बताया, तो आप के लिए एक आईडी पारित कर सकते हैं FragmentTransactionकी add(int, Fragment)विधि। हालाँकि, यह किसी फ़्रैगमेंट के लिए आईडी निर्दिष्ट नहीं करता है। यह में ViewGroupसम्मिलित करने के लिए एक की आईडी निर्दिष्ट करता है Fragment। यह उस उद्देश्य के लिए उपयोगी नहीं है जिसकी मुझे अपेक्षा है, क्योंकि यह विशिष्ट रूप से Fragmentएस की पहचान नहीं करता है , लेकिन ViewGroupएस। ये आईडी कंटेनरों की हैं जिन्हें गतिशील रूप से एक या अधिक टुकड़े जोड़े जा सकते हैं। FragmentS की पहचान करने के लिए इस तरह की विधि का उपयोग ViewGroupकरने से Fragmentआपको अपने द्वारा सम्मिलित किए गए लेआउट के लिए गतिशील रूप से s जोड़ने की आवश्यकता होगी । यह बहुत बोझिल होगा।

इसलिए यदि आपका सवाल यह है कि आप जिस गतिशील रूप से जोड़ रहे हैं, एक फ़्रैगमेंट के लिए एक विशिष्ट पहचानकर्ता कैसे बनाया जाता है, तो इसका उत्तर है FragmentTransaction' ऐड कंटेनर (int कंटेनर ViewId , फ़्रैगमेंट टुकड़ा, स्ट्रिंग टैग) विधि और FragmentManager' खोज ' फ़्रेग्मेंटबैंकटैग (स्ट्रिंग) विधि का उपयोग करें।

मेरे एक ऐप में, मुझे गतिशील रूप से तार उत्पन्न करने के लिए मजबूर किया गया था। लेकिन यह वास्तविक FragmentTransaction, वैसे भी इतना महंगा नहीं है।

टैग विधि का एक अन्य लाभ यह है कि यह एक ऐसे टुकड़े की पहचान कर सकता है जिसे UI में नहीं जोड़ा जा रहा है। FragmentTransaction की देखें ऐड (Fragment, String) विधि देखें। Fragments की जरूरत नहीं है View! उन्हें विन्यास परिवर्तनों के बीच अल्पकालिक स्थिति को बनाए रखने के लिए भी उपयोग किया जा सकता है!


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

12
@TomDignan कैसे एक टुकड़ा है कि एक ViewPager में जोड़ा जाएगा के बारे में? मैं उसका टैग कैसे सेट कर सकता हूं? मैं इस स्थिति में लेनदेन का उपयोग नहीं कर सकता।
गुइलहे

1
@GuilhE एक्टिविटी एक ऐडफ्रैगमेंट () मेथड प्रदान करती है जिसे आप व्यूपेंजर से रेफर कर सकते हैं। इससे पहले टैग लगाकर हैशमैप के साथ पूरा किया जा सकता है।
थॉमस डिगन

1
क्या इस जवाब पर जोर दिया जा सकता है कि आप इस बात पर जोर दें कि आप xml लेआउट में id सेट कर सकते हैं? क्योंकि मैंने व्यक्तिगत रूप से अन्य प्रश्नों को नहीं पढ़ा था और यह धारणा थी कि टुकड़े को आईडी सेट करने का कोई तरीका नहीं है ...
इवान

41

पता चलता है कि आपको खंड आईडी जानने की आवश्यकता नहीं हो सकती है।

डॉक्स से:

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 में आयोजित किया जाता है वह आपको मिलेगा।


4

ज्यादातर मामलों में आप आईडी के साथ ही टुकड़े टैग का उपयोग कर सकते हैं।
आप में टैग मान सेट कर सकते हैं FragmentTransaction.add(Fragment fragment, String tag );। फिर आप FragmentManager.findFragmentByTag(String tab)प्रश्न में टुकड़े को खोजने के लिए कमांड का उपयोग कर सकते हैं ।


2

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

मेरे समाधान अब तक सभी दुनिया के सबसे पुराने (जावा) ट्रिक पर भरोसा करते हैं: एक न्यूनतर टेम्प्लेट टुकड़ा बनाएं जो इसके निर्माणकर्ताओं में से एक में एक आईडी लेता है और एक प्रदान करता है getFragmentId() विधि जो उस आईडी को लौटाता है। मैंने तब उन अंशों को जाने दिया जिनकी प्रारंभिक पहचान की आवश्यकता है, उस टेम्पलेट का विस्तार करें और; देखा! समस्या सुलझ गयी।

यह समाधान, दुर्भाग्य से, टेम्पलेट के टुकड़े के एक सेट की आवश्यकता हो सकती है, प्रत्येक टुकड़े के प्रकार के लिए एक ListFragment, DialogFragmentया सादे पुराने Fragment(POFO?) जिन्हें शुरुआती पहचान की आवश्यकता होती है। लेकिन मेरे द्वारा उपलब्ध कराए गए लाभों को देखते हुए, मुझे लगता है कि टुकड़ों के मामले में यह प्रबंधनीय है।

घावों को भरने के लिए क्षमा करें :-)

चीयर्स!


0

निम्न का उपयोग करें:

एक टुकड़ा जोड़ने के लिए:

getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentToBeAdded, tag).commit();

मौजूदा टुकड़े की पहचान करने के लिए:

getFragmentManager().findFragmentByTag(fragmentName);

प्रश्न के लिए उत्तर प्रासंगिक नहीं है। कृपया जवाब अपडेट करें। हैप्पी कोडिंग
कोडविविकास

-1

टैग का उपयोग करते समय कृपया जोड़ना सुनिश्चित करें

fragmentTransaction.addToBackStack(null); 

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

यदि आप किसी खंड को हटाने वाले लेनदेन को AddToBackStack () नहीं कहते हैं, तो लेनदेन के प्रतिबद्ध होने पर वह टुकड़ा नष्ट हो जाता है और उपयोगकर्ता वापस उसमें नेविगेट नहीं कर सकता है। जबकि, यदि आप किसी खंड को हटाते समय AddToBackStack () कॉल करते हैं, तो टुकड़ा बंद हो जाता है और बाद में फिर से शुरू होता है यदि उपयोगकर्ता वापस नेविगेट करता है।

आप इसे इस पृष्ठ के अंत में पा सकते हैं ।

मुझे लगभग 30 मिनटों में यह पता लगाने की कोशिश करनी पड़ी कि एक साधारण findFragmentByTag();कॉल के जरिए मेरा फ्रैगमेंट क्यों नहीं हो रहा है


-2

टॉम के जवाब के अलावा, विधि बदलने के अलावा विधि के अलावा, खंड टैग का भी समर्थन करता है।

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