2012-02-20 15 views

उत्तर

100

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

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

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

इसलिए यदि आपके प्रश्न एक टुकड़ा आप गतिशील रूप से जोड़ रहे हैं के लिए अद्वितीय पहचानकर्ता बनाने का तरीका है, इस सवाल का जवाब उपयोग करने के लिए FragmentTransaction के add(int containerViewId, Fragment fragment, String tag) विधि और FragmentManager के findFragmentByTag(String) तरीका है।

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

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

+0

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

+0

@Namratha, आप नहीं कर सकते। –

+9

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

3

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

2

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

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

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

चिकित्सा घाव ऊपर फाड़ :-)

चियर्स के लिए खेद है!

35

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

डॉक्स से:

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

0

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

1

उपयोग निम्नलिखित:

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

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

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

getFragmentManager().findFragmentByTag(fragmentName); 
संबंधित मुद्दे