2012-03-07 4 views
23

मुझे पता है कि जब आप पहली बार एक टुकड़े को तत्काल कर रहे हैं तो आप setArguments(Bundle) का उपयोग करके तर्क पारित कर सकते हैं और उन्हें का उपयोग करके खंड में पुनर्प्राप्त कर सकते हैं।क्या किसी गतिविधि में जोड़े जाने के बाद एक खंड में तर्क पारित करना संभव है?

हालांकि, मेरे ऐप में मेरे पास टुकड़े हैं जिन्हें एक गतिविधि में जोड़ने के बाद कई बार अलग किया जाएगा और संलग्न किया जाएगा। पुनः संलग्न करने पर, मुझे एक खंड को इसे पुनः प्राप्त करने से पहले अपनी सामग्री को संशोधित करने के लिए एक तर्क पारित करने की आवश्यकता हो सकती है। मैं पहली बार खंड को प्रदर्शित करने के लिए setArguments का उपयोग कर सकता हूं, लेकिन बाद के अवसरों पर जो काम नहीं करेगा। savedInstanceState इस मामले में काम नहीं करेगा क्योंकि मुझे खंड को अलग करने से पहले तर्क के मूल्य को नहीं पता होगा।

मुझे पता है कि मैं सिर्फ एक विधि को कार्यान्वित कर सकता हूं जिसे मैं तर्क स्थापित करने वाले टुकड़े को जोड़ने से पहले कॉल करूंगा, लेकिन ऐसा लगता है कि ऐसा कुछ ऐसा हो सकता है जो पहले से ही एपीआई में हो और मैं इसे देख नहीं रहा हूं।

क्या कुछ अंतर्निहित है जो मुझे ऐसा करने की अनुमति देगा, या मुझे इसे अपने आप लागू करना होगा? रिकॉर्ड के लिए, मैं समर्थन पैकेज (v4) का उपयोग कर रहा हूं।

बहुत धन्यवाद!

+0

पुनः संलग्न करके आपका क्या मतलब है? टुकड़े केवल एक बार एक गतिविधि से जुड़े होंगे (AFAIK) और यदि यह गतिविधि से अलग हो जाता है तो यह नष्ट हो जाता है। क्या आपका मतलब है कि जब उपयोगकर्ता बैक बटन हिट करता है तो टुकड़ा लेआउट में वापस आ जाता है? – 500865

उत्तर

12

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

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

मैं क्या बता सकते हैं एपीआई में कोई बात नहीं है से ...

अपडेट: यह अभी भी सच है और सिर्फ ठीक काम करता है। मैंने पाया कि एक बार यह अधिक जटिल है, यह Otto इवेंटबस जैसे कुछ उपयोग करने के लिए बहुत साफ और आसान है। अत्यधिक अनुशंसित imho।

+0

जो तर्क मैं पारित कर रहा हूं वह बहुत छोटा है - यह वास्तव में सामग्री नहीं है जो टुकड़े में जोड़ा जा रहा है लेकिन टुकड़ा इसके मूल्य के आधार पर सामग्री को दिखाएगा/छुपाएगा। यह लगभग थोड़ा सीधा लग रहा था, जिसने मुझे सोचा कि शायद मैं जो कर रहा था उसके लिए एक एपीआई था। अनुमान नहीं। सहायता के लिए धन्यवाद! –

2

क्या किसी गतिविधि में जोड़े जाने के बाद एक खंड में तर्क पारित करना संभव है?

सं


लेकिन आप देख रहे हैं गतिविधि के साथ संवाद करने के तरीके के लिए जो करने के लिए एक टुकड़ा बाँध दिया जाता है, तो आप इसे जिस तरह से @manfred उल्लेख किया है या अन्य तरीकों से वर्णित कर सकते हैं Documentation

2 टुकड़े एक-दूसरे के साथ संवाद करने का एक और दिलचस्प तरीका है। यह setTargetFragment और getTargetFragment विधियों का उपयोग कर रहा है। यहाँ, तो fragmentBfragmentA प्रभावित कर सकते हैं, तो आप fragmentBfragmentA करने के लिए और जब परिवर्तन fragmentB अंदर से fragmentA को अपडेट करने की आवश्यकता है, तो आप ((fragmentA) getTargetFragment()) द्वारा इसे करने के लिए एक संदर्भ हो और इसे अद्यतन करने fragmentA की विधि का उपयोग करेंगे की setTargetFragment होगा।

उम्मीद है कि यह मदद करता है। सौभाग्य।

+0

वह खंड के साथ संवाद करने के बारे में नहीं पूछ रहा है, वह पूछ रहा है कि एक बार खंड –

+0

पर सेट करने के लिए तर्क कैसे बदलें, आपका "नहीं" बहुत भ्रामक और गलत है, ओपी प्रश्न का उत्तर, जिसे आपने उद्धृत किया है, का जवाब पूरी तरह से @ user3978046 द्वारा दिया गया है –

19

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

frg.getArguments().putString("someKey", "someValue"); 

तर्क कोड के साथ टुकड़ा तर्क को संशोधित करने और कायम और अभिविन्यास में परिवर्तन और इस तरह के दौरान बहाल हो जाएगा।

नोट यह विधि भी उपयोगी है जब एक लेआउट में एक्सएमएल के माध्यम से टुकड़ा बनाया जा रहा है। आम तौर पर इस तरह के एक टुकड़े पर तर्क निर्धारित करने में सक्षम नहीं होगा; जिस तरह से इस प्रतिबंध से बचने के लिए एक नहीं तर्क निर्माता जो इतनी तरह तर्क बंडल बनाता है बनाने के लिए है: अपनी गतिविधि के onCreate विधि में बाद में कहीं

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

आप तो करना होगा:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

इस डेटा देता है तर्क बंडल में, जो तब आपके टुकड़े में कोड के लिए उपलब्ध होगा।

+0

हां से ऊपर, लेकिन क्या आपके टुकड़े को नोटिस करने का कोई तरीका है कि आप बंडल में तर्क जोड़ देंगे? मुझे लगता है कि मैं तर्क जोड़ सकता हूं और फिर खंड पर एक विधि का पर्दाफाश कर सकता हूं जिसे गतिविधि तर्कों को दोबारा जांचने के लिए मजबूर कर सकती है। इसके साथ समस्या यह है कि गतिविधि नहीं जानता कि जीवन चक्र में किस चरण में टुकड़ा है। – Glaucus

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^