टुकड़े क्यों, और गतिविधियों के बजाय टुकड़ों का उपयोग कब करना है?


484

Android API 11+ में, Google ने एक नया वर्ग जारी किया है जिसका नाम है Fragment

वीडियो में, गूगल ने पता चलता है कि जब भी संभव ( link1 , link2 ), हम गतिविधियों के बजाय टुकड़ों का उपयोग करना चाहिए, लेकिन वे वास्तव में क्यों नहीं समझा था।

टुकड़ों का उद्देश्य और उनके कुछ संभावित उपयोग (कुछ यूआई उदाहरणों के अलावा जो सरल विचारों / लेआउट द्वारा आसानी से प्राप्त किए जा सकते हैं) क्या है?

मेरा प्रश्न टुकड़ों के बारे में है:

  1. एक टुकड़े का उपयोग करने के उद्देश्य क्या हैं?
  2. गतिविधियों / विचारों / लेआउट का उपयोग करने की तुलना में टुकड़ों का उपयोग करने के क्या फायदे और नुकसान हैं?

बोनस प्रश्न:

  1. क्या आप अंशों के लिए कुछ सचमुच दिलचस्प उपयोग दे सकते हैं? Google ने अपने वीडियो में जिन चीजों का उल्लेख नहीं किया है?
  2. टुकड़ों और उन गतिविधियों के बीच संवाद करने का सबसे अच्छा तरीका क्या है?
  3. जब आप अंशों का उपयोग करते हैं, तो याद रखने वाली सबसे महत्वपूर्ण बातें क्या हैं? आपके अनुभव से कोई सुझाव और चेतावनी?


जवाबों:


282

# 1 & # 2 एक टुकड़ा का उपयोग करने के उद्देश्य क्या हैं और गतिविधियों / विचारों / लेआउट का उपयोग करने की तुलना में टुकड़े का उपयोग करने के फायदे और नुकसान क्या हैं?

Fragments पुन: प्रयोज्य उपयोगकर्ता इंटरफ़ेस बनाने के लिए Android का समाधान हैं। आप गतिविधियों और लेआउट का उपयोग करके कुछ समान चीजों को प्राप्त कर सकते हैं (उदाहरण के लिए उपयोग करके शामिल हैं)। तथापि; टुकड़ों को हनीकोम्ब और ऊपर से एंड्रॉइड एपीआई में वायर्ड किया जाता है। मुझे विस्तृत होने दो;

  • ActionBar। यदि आप अपने ऐप को नेविगेट करने के लिए वहां टैब चाहते हैं, तो आप जल्दी से देखते हैं कि ActionBar.TabListenerइंटरफ़ेस आपको विधि के FragmentTransactionलिए इनपुट तर्क के रूप में देता है onTabSelected। आप शायद इसे अनदेखा कर सकते हैं, और कुछ और कर सकते हैं और चतुर, लेकिन आप एपीआई के खिलाफ काम करेंगे, इसके साथ नहीं।

  • FragmentManagerहैंडल «वापस» आप के लिए एक बहुत चालाक तरीके से। बैक का मतलब आखिरी गतिविधि से नहीं है, जैसे कि नियमित गतिविधियों के लिए। इसका अर्थ है पिछली खंड अवस्था में वापस।

  • आप शांत उपयोग कर सकते हैं ViewPagerएक साथ FragmentPagerAdapterकड़ी चोट इंटरफेस बनाने के लिए। FragmentPagerAdapterकोड एक नियमित एडाप्टर की तुलना में बहुत क्लीनर है, और यह अलग-अलग टुकड़ों के instantiations नियंत्रित करता है।

  • जब आप फोन और टैबलेट दोनों के लिए एप्लिकेशन बनाने का प्रयास करेंगे तो आपके जीवन में बहुत आसानी होगी। चूंकि टुकड़े हनीकॉम्ब + एपीआई के साथ इतने बंधे होते हैं, आप कोड का पुन: उपयोग करने के लिए उन्हें फोन पर भी उपयोग करना चाहेंगे। यही कारण है कि संगतता पुस्तकालय काम में आता है।

  • तुम भी और केवल फोन के लिए इस्तेमाल किया क्षुधा के लिए टुकड़े का उपयोग करना चाहिए कर सकते हैं। अगर आपके मन में पोर्टेबिलिटी है। मैं ActionBarSherlock"ICS लुकिंग" एप्स बनाने के लिए कम्पैटिबिलिटी लाइब्रेरियों का उपयोग करता हूं , जो कि संस्करण 1.6 में सभी समान दिखते हैं। आपको ActionBarटैब, ओवरफ्लो, स्प्लिट एक्शन बार, व्यूपेगर आदि जैसी नवीनतम सुविधाएँ मिलती हैं ।

बोनस 2

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


5
सबसे पहले, धन्यवाद। मैं उन लोगों की सराहना करता हूं जो सूचनात्मक (अभी तक कम) उत्तर देते हैं और न केवल मुझे एक मैनुअल .anyway के लिए एक लिंक देते हैं, इसके अलावा विशेष वर्गों पर काम करने के लिए अतिरिक्त सुविधाएँ, क्या आप टुकड़ों के साथ काम करने के फायदे और नुकसान के बारे में सोच सकते हैं। ?
एंड्रॉयड डेवलपर

4
मुझे लगता है कि आपको पूछताछ में अधिक प्रत्यक्ष होना होगा। मैंने ऊपर सिर्फ चार प्रमुख फायदे दिए हैं।
ग्लेन बेच

2
ठीक है, अनुकूलित विचारों और गतिविधियों की तुलना में नुकसान के बारे में क्या?
एंड्रॉइड डेवलपर

2
इंटेंट का उपयोग करके आप टुकड़ों के बीच कैसे संवाद करते हैं? क्या सभी टुकड़ों को "जीवित" (गतिविधि में जोड़ा गया) होना चाहिए ताकि वे एक दूसरे के साथ संवाद कर सकें?
Android डेवलपर

55
एक टुकड़े को कभी भी दूसरे टुकड़े से सीधे बात नहीं करनी चाहिए - इसके बजाय मूल गतिविधि से गुजरें। इस तरह आप स्पेगेटी कोड के साथ समाप्त नहीं होते हैं, लेकिन कोड को प्रबंधित करना आसान है।
slott

70

निश्चित नहीं है कि आप किस वीडियो (ओं) का उल्लेख कर रहे हैं, लेकिन मुझे संदेह है कि वे कह रहे हैं कि आपको गतिविधियों के बजाय टुकड़ों का उपयोग करना चाहिए, क्योंकि वे सीधे विनिमेय नहीं हैं। देव गाइड में वास्तव में काफी विस्तृत प्रविष्टि है, विवरण के लिए इसे पढ़ने पर विचार करें।

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


1
अद्यतन प्रश्न। अब इसमें google के वीडियो के लिंक हैं। भी, स्पष्टीकरण के लिए धन्यवाद, लेकिन मुझे अभी भी अपने प्रश्न के बारे में स्पष्टीकरण की आवश्यकता है।
एंड्रॉइड डेवलपर

5
देव गाइड प्रविष्टि पढ़ें, इसमें पर्याप्त विवरण से अधिक है। यह संभावना नहीं है कि आपको एसओ पर 'टुकड़ों के शांत उपयोग' का जवाब मिलेगा - अस्पष्ट तरीके से और एक भी जवाब नहीं है। नंबर 4 को देव गाइड में विशेष रूप से उत्तर दिया गया है-- डेवलपर.
निकोले एलेनकोव

1
जहाँ तक मुझे पता है, यह विधि इस बात पर निर्भर करती है कि कौन सी गतिविधि में कौन सा टुकड़ा हो सकता है। इसके अलावा, कृपया मुख्य प्रश्नों (पहले दो) का उत्तर दें।
एंड्रॉइड डेवलपर

3
मूल प्रश्न के उत्तर पर जोर देने के लिए Android डेवलपर का धन्यवाद। एटीएम ने मेरे लिए कुछ भी उपयोगी नहीं देखा है जो एक्सएमएल "एक्सएमएल" में "टैग" शामिल है। जिस तरह की चीजें मुझे मूल्यवान लगती हैं, वह एक लेआउट को निर्दिष्ट करने की क्षमता होगी जो सभी प्रस्तावों पर सबसे अच्छा उपयोगकर्ता अनुभव में जादुई रूप से आकार देगा। जो मैं आपको बता सकता हूं उससे अभी भी उस कोड को स्वयं करने की आवश्यकता है। एक अन्य संभावित मूल्य पुन: प्रयोज्य घटकों में कोड + संसाधनों को बंडल करने का एक तरीका होगा, जो पुन: उपयोग किए जाने वाले ऐप्स में नहीं पाए जाते हैं, लेकिन फिर से वहां दिखाई नहीं देते हैं। मैं एक बहुत अच्छा कारण चाहता हूं।
मेलिंडा ग्रीन

2
मैं उस तरीके को समझना शुरू कर रहा हूं जिस तरह से Google टुकड़ों का उपयोग करने का सुझाव देता है, लेकिन मैं @NikolayElenkov के साथ काफी सहमत हूं। मेरे लिए, गतिविधियों का उपयोग करना अभी भी सबसे मजबूत और कम जटिल तरीका लगता है ..
andrea.rinaldi

49

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

टुकड़े के बारे में महत्वपूर्ण बातें निम्नलिखित हैं:

  1. एक टुकड़े का अपना लेआउट और अपने स्वयं के जीवनचक्र कॉलबैक के साथ अपना व्यवहार होता है।

  2. जब गतिविधि चल रही हो तब आप किसी गतिविधि में अंश जोड़ या हटा सकते हैं।

  3. मल्टी-फलक UI बनाने के लिए आप एकल गतिविधि में कई टुकड़े जोड़ सकते हैं।

  4. एक टुकड़ा कई गतिविधियों में इस्तेमाल किया जा सकता है।

  5. टुकड़ा जीवन चक्र इसकी मेजबान गतिविधि के जीवनचक्र से निकटता से संबंधित है।

  6. जब गतिविधि को रोक दिया जाता है, तो तीक्ष्णता में उपलब्ध सभी टुकड़ों को भी रोक दिया जाएगा।

  7. एक टुकड़ा एक व्यवहार को लागू कर सकता है जिसमें कोई उपयोगकर्ता इंटरफ़ेस घटक नहीं है।

  8. एंड्रॉइड 3 में एंड्रॉइड एपीआई (हनीकॉम्ब) में एपीआई संस्करण 11 के साथ टुकड़े जोड़े गए थे ।

अधिक जानकारी के लिए, कृपया आधिकारिक साइट, टुकड़े पर जाएँ


1. जैसा कि आपने # 8 पर उल्लेख किया है, इसमें कोई लेआउट होना आवश्यक नहीं है। 6. आप "साधन" के बाद भाग से चूक गए। वैसे भी, दूसरों की मदद करने के लिए धन्यवाद यह स्पष्ट करता है। मैं आपको +1 दूंगा।
एंड्रॉइड डेवलपर

1
# 8 के बारे में, नो-लेआउट टुकड़े (यानी 'हेडलेस' टुकड़ा) का एक संभावित उदाहरण वह होगा जो किसी कार्य को करता है, जो कुछ हद तक कम होने के बावजूद (जैसे कि एक संक्षिप्त HTTP अनुरोध) कॉन्फ़िगरेशन परिवर्तनों से बचने के लिए अभी भी आवश्यक है और इस तरह निर्भर करता है उनके द्वारा संरक्षित किए जा रहे सटीक विखंडन उदाहरण पर (विखंडन पर setRetainInstance (सत्य) का उपयोग करके)। लेआउट अंशों के रूप में, setRetainInstance (सच) बहुत मायने नहीं रखता है, क्योंकि यह आवश्यक (यानी एक स्मृति रिसाव) को मुक्त करने से उनके विचारों से जुड़े संसाधनों को रोकता है।
14

नोट: "# 8" अब "# 7" है।
टूलमेकरसैट

21

यह महत्वपूर्ण जानकारी है जो मुझे टुकड़ों पर मिली है:

ऐतिहासिक रूप से एंड्रॉइड ऐप में प्रत्येक स्क्रीन को एक अलग गतिविधि के रूप में लागू किया गया था। यह स्क्रीन के बीच सूचना पारित करने में एक चुनौती पैदा करता है क्योंकि एंड्रॉइड इंटेंट तंत्र सीधे गतिविधियों के बीच एक संदर्भ प्रकार (यानी ऑब्जेक्ट) को पारित करने की अनुमति नहीं देता है। इसके बजाय वस्तु को क्रमबद्ध या विश्व स्तर पर सुलभ संदर्भ उपलब्ध कराया जाना चाहिए।

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

स्रोत: https://www.pluralsight.com/blog/software-development/android-fragments


3
यह सच है, लेकिन इसके लिए समाधान हैं: पार्सलबल का उपयोग करें जब यह एक विशाल वस्तु नहीं है (और इसे आसान बनाने के लिए एक प्लगइन है), और यदि यह एक विशाल वस्तु है, तो आप हमेशा एक स्थिर संदर्भ का उपयोग कर सकते हैं जो शून्य पर सेट हो जाएगा जब आप नई गतिविधि के लिए (या जब आप इसे नष्ट कर देते हैं, तो आपकी आवश्यकता के आधार पर)।
एंड्रॉयड डेवलपर

@androiddeveloper: "Parcelable का उपयोग करें" एक "डेटा गुजरने वाले सिरदर्द की मेरी परिभाषा फिट बैठता है जो कि टुकड़े का उपयोग करने से बचा जाता है"। यदि कोई जटिल साझा स्थिति है जो स्क्रीन की एक श्रृंखला से गुजरने के लिए बनी रहती है, तो गतिविधि + फ्रेग्मेंट एक अच्छा समाधान है, IMHO। (हालांकि मैंने फ्रैग्मेंट बैक स्टैक को छोड़ दिया, और "बैक" का अर्थ क्या है, इसका प्रबंधन खुद किया।)
टूलमेकरसेव

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

10

उपकरण के साथ ऐप में गतिविधियाँ पूर्ण स्क्रीन घटक हैं, बाकी सब कुछ अधिमानतः टुकड़े हैं। टूलबार के साथ एक पूर्ण स्क्रीन माता-पिता की गतिविधि में कई पैन, स्क्रॉल करने योग्य पृष्ठ, संवाद आदि (सभी टुकड़े) हो सकते हैं, जिनमें से सभी को माता-पिता से एक्सेस किया जा सकता है और माता-पिता के माध्यम से संचार किया जा सकता है।

उदाहरण:

गतिविधि A, गतिविधि B, गतिविधि C:

  • सभी गतिविधियों को एक ही कोड को दोहराया जाना चाहिए, उदाहरण के लिए एक मूल टूलबार दिखाने के लिए, या मूल गतिविधि से विरासत में मिला (प्रबंधन करने के लिए बोझिल हो जाता है)।
  • एक गतिविधि से दूसरे में जाने के लिए, या तो सभी को मेमोरी (ओवरहेड) में होना चाहिए या दूसरे को खोलने के लिए नष्ट होने की आवश्यकता है।
  • गतिविधियों के बीच संचार इंटेंट्स के माध्यम से किया जा सकता है।

बनाम

गतिविधि ए, फ्रैगमेंट 1, फ्रैगमेंट 2, फ्रैगमेंट 3:

  • कोई भी कोड पुनरावृत्ति नहीं है, सभी स्क्रीन में टूलबार इत्यादि हैं।
  • एक टुकड़े से दूसरे में जाने के कई तरीके - पेजर, मल्टी पैन आदि देखें।
  • गतिविधि में अधिकांश डेटा होते हैं, इसलिए न्यूनतम अंतर-टुकड़े संचार की आवश्यकता होती है। यदि आवश्यक हो, तो इंटरफेस के माध्यम से आसानी से किया जा सकता है।
  • टुकड़े को पूर्ण स्क्रीन होने की आवश्यकता नहीं है, उन्हें डिजाइन करने में बहुत लचीलापन है।
  • यदि विचारों की आवश्यकता नहीं है, तो टुकड़े को लेआउट को बढ़ाने की आवश्यकता नहीं है।
  • कई गतिविधियाँ एक ही टुकड़े का उपयोग कर सकती हैं।

सही जवाब!
सत्थेश

8

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

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

मैं एंड्रॉइड के लिए नया हूं और अभी भी लगता है कि एक टुकड़ा इस तरह से उपयोगी है।


हाँ। हालाँकि, मैं अभी भी कभी-कभी टुकड़ों के उपयोग के सही तरीके के बारे में उलझन में हूँ, और ऐसा इसलिए है क्योंकि दोनों टुकड़ों और गतिविधियों के जटिल जीवनचक्र के कारण।
एंड्रॉयड डेवलेपर

@androiddeveloper क्या आप ज्यादातर गतिविधियों का उपयोग करते हैं?
माइकल एलन हफ

@MichaelAlanHuff टैबलेट का समर्थन करते समय, मुझे लगता है कि फ्रेगमेंट का उपयोग करना बेहतर है। इसके अलावा, जब अभिविन्यास परिवर्तन और इसी तरह की अन्य घटनाओं का समर्थन करते हैं, तो आप DialogFragment का उपयोग करना चाह सकते हैं, क्योंकि यह आपको उन्हें पुनर्स्थापित करने की अनुमति देता है
Android डेवलपर

@androiddeveloper, यही मुझे भी लगता है। मैंने अक्सर डायलॉगफ्रैगमेंट का उपयोग नहीं किया है। तर्क की प्रतिरूपकता में मदद करने के लिए, बहुत से Android डेवलपर्स तर्क को एक ला वर्ग के मोर्टार रखने के लिए कस्टम दृश्यों का उपयोग करना शुरू कर रहे हैं। यहां Airbnb vimeo.com/127799187 के
माइकल एलन हफ

@MichaelAlanHuff टुकड़ों का उपयोग करना भी उपयोगी हो सकता है यदि आपको लगता है कि वर्तमान स्क्रीन किसी अन्य स्क्रीन का हिस्सा हो सकती है।
एंड्रॉइड डेवलपर

5

मुझे पता है कि यह पहले से ही मृत्यु पर चर्चा की गई थी, लेकिन मैं कुछ और बिंदु जोड़ना चाहूंगा:

  • Frags का उपयोग Menus को आबाद करने के लिए किया जा सकता है और MenuItemअपने दम पर क्लिक को संभाल सकता है । इस प्रकार अपनी गतिविधियों के लिए फ्यूचर मॉडुलेशन विकल्प देना। आप ContextualActionBar सामान वगैरह के बारे में अपनी एक्टिविटी के बारे में जाने बिना कर सकते हैं और मूल रूप से इसे अपने एक्टिविटी हैंडल (नेविगेशन / सेटिंग्स / अबाउट) के बेसिक सामान से अलग कर सकते हैं।

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


0

टुकड़े गतिविधि के भीतर रहते हैं और हैं:

  • इसका अपना जीवनचक्र है
  • इसका अपना लेआउट
  • अपने बच्चे के टुकड़े और आदि

Fragments के बारे में सोचें कि यह जिस मुख्य गतिविधि की उप गतिविधि है, वह स्वयं की नहीं हो सकती है और इसे बार-बार पुन: उपयोग किया जा सकता है। उम्मीद है की यह मदद करेगा :)


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

0

1. एक टुकड़े का उपयोग करने का प्रस्ताव?

  • उत्तर:
    1. डिवाइस फॉर्म-फैक्टर अंतर से निपटना।
    2. एप्लिकेशन स्क्रीन के बीच जानकारी पारित करना।
    3. उपयोगकर्ता इंटरफ़ेस संगठन।
    4. उन्नत यूआई रूपकों।

0

एक टुकड़ा एक गतिविधि के अंदर रहता है, जबकि एक गतिविधि खुद से रहती है।


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