कितने गतिविधियां बनाम टुकड़े?


185

परिचय:

मूल "फ्रेगमेंट ट्यूटोरियल" पैटर्न कुछ इस तरह है:

  1. टैबलेट पर, बाईं ओर एक सूची है, दाईं ओर विवरण है।
  2. दोनों हैं Fragmentsऔर दोनों एक ही में रहते हैं Activity
  3. एक फोन पर, एक Fragmentमें एक सूची है Activity
  4. Activityविवरण के साथ एक नया लॉन्च करें Fragment

(उदाहरण के लिए एंड्रॉइड 3.0 Fragments API द्वारा डायने हैकॉर्न और फ्रैगमेंट्स एपीआई गाइड )

दोनों उपकरणों पर, कार्यक्षमता में है Fragments। (सरल)

पर गोली , पूरे अनुप्रयोग है 1Activity , पर फोन , देखते हैं कईActivities


प्रशन:

  • क्या फोन ऐप को कई में विभाजित करने का एक कारण है Activities?

इस पद्धति के साथ एक समस्या यह है कि आप मुख्य टैबलेट में और अलग फोन में बहुत सारे तर्क की नकल करते हैंActivityActivities

  • दोनों मामलों में 1 गतिविधि मॉडल को बनाए रखना आसान नहीं होगा, स्विच करने के समान तर्क का Fragmentsउपयोग करके और बाहर (बस एक अलग लेआउट का उपयोग करके)?

इस तरह से अधिकांश तर्क Fragmentsअपने आप में रहते हैं, और Activityकोड का केवल एक ही दोहराव है।

इसके अलावा मैंने जो पढ़ा ActionBarSherlockहै वह यह है कि इसके Fragmentsबजाय सबसे अच्छा काम करना लगता है Activities(लेकिन मैंने अभी तक इसके साथ काम नहीं किया है)।

क्या ट्यूटोरियल ओवरसाइम्प्लीफाइड हैं, या क्या मैंने इस दृष्टिकोण में कुछ प्रमुख याद किया है?


हमने कार्यालय में सफलतापूर्वक दोनों तरीकों की कोशिश की है - लेकिन मैं एक बड़ी परियोजना शुरू करने वाला हूं और जितना संभव हो सके अपने लिए चीजों को आसान बनाना चाहता हूं।

संबंधित प्रश्नों के कुछ लिंक:


अपडेट

प्रश्न पर इनाम शुरू किया - अभी भी इस बारे में आश्वस्त नहीं हूं कि मुझे अपने टैबलेट गतिविधि में और प्रत्येक फोन गतिविधि में अपने ऐप लॉजिक की नकल करने की आवश्यकता क्यों है।

स्क्वायर में लोगों द्वारा एक दिलचस्प लेख भी मिला, जो पढ़ने लायक है:


38
एक भयानक और अच्छी तरह से लिखित प्रश्न के लिए +1।
सिद्धार्थ लेले

यह कुछ ऐसा है जो मुझे इन दिनों बहुत परेशान करता है, वर्तमान में मैं एक ऐसे अनुप्रयोग पर काम कर रहा हूं जिसमें डिजाइन में बहुत सारे टुकड़े शामिल हैं और यह फोन और टैबलेट दोनों में उपलब्ध होगा, मैं एक मध्य मार्ग की तलाश कर रहा हूं, लेकिन अभी तक कोई भी नहीं मिल सका है ...
निक्सित पटेल

1
मेरा मतलब ईमानदारी से कोई अपराध नहीं है, लेकिन मुझे लगता है कि आपने सिर्फ वही स्वीकार किया जो आप वास्तविक उत्तर के बजाय सुनना चाहते थे। स्कूबा का जवाब Google द्वारा अनुशंसित नहीं है और जिस ब्लॉग पोस्ट को मैंने पसंद किया है, वह क्यों है।
pjco

1
@pjco विशेष रूप से मैं onItemSelected()गतिविधि में विधि होने से असहमत हूं । मेरे "वास्तविक" ऐप में, मेरे पास कई सूचियाँ और उप-कलाकार हैं। यह पैटर्न बताता है कि मेरी टैब गतिविधि में onItemSelected()प्रत्येक सूची को संभालने की एक विधि होनी चाहिए । साथ ही फोन एक्टिविटीज में से प्रत्येक में एक ही लॉजिक डुप्लिकेट होना चाहिए। IMHO यह बेहतर है कि आइटम को प्रत्येक तर्क में चयनित तर्क में रखा जाए - कोई दोहराव नहीं है और मैं कोड को संरचित करने के उस तरीके को पसंद करता हूं। मुझे उम्मीद है कि यह मदद करता है
रिचर्ड ले मेसियर

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

जवाबों:


41

मैं सहमत हूं कि ट्यूटोरियल बहुत सरल हैं। वे सिर्फ परिचय देते हैं Fragmentsलेकिन मैं सुझाव के अनुसार पैटर्न से सहमत नहीं हूं।

मैं यह भी मानता हूं कि कई गतिविधियों में अपने ऐप के तर्क को नक़ल करना अच्छा नहीं है (देखें विकिपीडिया पर DRY Principle )।


मैं ActionBarSherlockफ्रेगमेंट्स डेमो ऐप ( यहां और स्रोत कोड डाउनलोड करें ) द्वारा उपयोग किए गए पैटर्न को पसंद करता हूं । डेमो जो कि प्रश्न में उल्लिखित ट्यूटोरियल से सबसे अधिक मेल खाता है, ऐप में "लेआउट" नामक एक है; या FragmentLayoutSupportस्रोत कोड में।

इस डेमो में, तर्क को अंदर Activityऔर बाहर ले जाया गया है FragmentTitlesFragmentवास्तव में टुकड़े को बदलने के लिए तर्क होता है। इस तरह, प्रत्येक गतिविधि बहुत सरल है। कई बहुत ही सरल गतिविधियों की नकल करना, जहां कोई भी तर्क गतिविधियों के अंदर नहीं है, यह बहुत ही सरल बनाता है।

तर्कों में तर्क डालकर, कोड को एक से अधिक बार लिखने की आवश्यकता नहीं है ; यह उपलब्ध नहीं है कि फ्रैगमेंट को किस गतिविधि में रखा गया है। यह बुनियादी ट्यूटोरियल द्वारा सुझाए गए एक से अधिक शक्तिशाली पैटर्न बनाता है।

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

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

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


व्यापक उत्तर के लिए thx - मैंने ABS डेमो पर ध्यान दिया है, और मुझे लगता है कि वहाँ बहुत सारे अच्छे कोड हैं। मैं इसके बजाय अपने तर्क के बहुत सारे
अंशों

डेमो एप्लिकेशन यहां स्थानांतरित हो गया है: play.google.com/store/apps/…
फिलिपींस ई।

मुझे लगता है कि आप जिस पैटर्न का वर्णन कर रहे हैं, वह मूल Google नमूना कोड से है: android-developers.blogspot.com/2011/02/… मुझे लगता है कि ActionBarSherlock ने बस ABS कक्षाओं का उपयोग करने के लिए Google डेमो कोड पोर्ट किया था।
दान जे

17

मुझे लगता है कि आप सही रास्ते पर हैं। (और हाँ, ट्यूटोरियल अति-सरलीकृत हैं)।

टेबलेट लेआउट में, आप एकल गतिविधि का उपयोग कर सकते हैं और फ़्रैगमेंट (कई 'पैन' में) स्वैप कर सकते हैं। फ़ोन लेआउट में रहते हुए आप प्रत्येक फ़्रैगमेंट के लिए एक नई गतिविधि का उपयोग कर सकते हैं।

इस तरह:

यहां छवि विवरण दर्ज करें

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

कोड को कम करने में मदद करने के लिए आप एक का उपयोग कर सकते हैं BaseActivityऔर उससे विस्तार कर सकते हैं ।

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

यदि उपयोगकर्ता के पास फोन है, तो आप बहुत कम कोड के साथ एक नियमित गतिविधि का उपयोग कर सकते हैं और इसका विस्तार MyBaseSingleFragActivityया कुछ इसी तरह का हो सकता है। ये गतिविधियाँ बहुत सरल हो सकती हैं, कोड की 5-10 पंक्तियाँ (शायद इससे भी कम)।

मुश्किल हिस्सा इरादे और whatnot मार्ग है। * (संपादित करें: अधिक नीचे देखें)।

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

* नियमित रूप से आशय अनुमार्गण होने के लाभों में से एक यह है कि आप बैक-स्टैक में कहीं से भी स्पष्ट रूप से गतिविधि शुरू कर सकते हैं। एक उदाहरण खोज परिणामों के मामले में हो सकता है। (MySearchResults.class)।

अधिक के लिए यहाँ पढ़ें:

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

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


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

यहाँ लाभ यह है कि आपका टेबलेट कोड कई पैन में रूट करने की उम्मीद कर सकता है। कभी-कभी आप एकल इरादे पर कई पैन बदलना चाहेंगे। जैसे कि बड़े फलक में दाईं ओर पहले आइटम के डिटेल के साथ बाईं ओर एक खोज परिणाम। यह कोड एकल लेआउट के लिए पोर्टेबल नहीं होगा।
pjco

जब कई होते हैं, तो टुकड़ों को स्विच करना ठीक क्यों है, लेकिन अगर केवल 1 टुकड़ा दिखाई दे रहा है, तो मुझे दूसरे टुकड़े पर स्विच नहीं करना चाहिए?
रिचर्ड ले मेसियर

मुझे यकीन नहीं है कि आप क्या समझते हैं, लेकिन ऊपर मेरी टिप्पणी को स्पष्ट करने के लिए: कभी-कभी आप एक बहु-टुकड़े लेआउट में एक ही समय में 1 से अधिक टुकड़े को बदलना चाह सकते हैं। इसके लिए 2 खंडों को बदलने के लिए कोड की आवश्यकता होती है, कि आप एक भी टुकड़े के लेआउट में पुनः प्रयोग नहीं करेंगे
pjco

आपका स्वागत है :) कृपया उत्तोलन करें या स्वीकार करें यदि आपको लगता है कि उत्तर मददगार है
pjco

6

यहाँ उसी के संबंध में रेटो मीयर का जवाब है, जो यूडेसिटी के एंड्रॉइड फंडामेंटल्स पाठ्यक्रम के इस वीडियो से लिया गया है ।

ऐसे कई कारण हैं जिनसे आप अपने ऐप को विभिन्न गतिविधियों में तोड़ना बेहतर समझेंगे।

  • एक एकल गतिविधि होने से आपके कोड की जटिलता बढ़ जाती है, जिससे पढ़ना, परीक्षण और रखरखाव करना मुश्किल हो जाता है।
  • आशय बनाने और प्रबंधित करने के लिए बहुत कठिन फ़िल्टर करता है।
  • कसकर युग्मन स्वतंत्र घटकों के जोखिम को बढ़ाता है।
  • यदि यह एकल गतिविधि संवेदनशील जानकारी और साझा करने के लिए सुरक्षित जानकारी दोनों को शामिल करता है, तो सुरक्षा जोखिमों को पेश करना अधिक संभव बनाता है।

जब भी संदर्भ बदलता है, अंगूठे का एक अच्छा नियम एक नई गतिविधि बनाना है। उदाहरण के लिए, एक अलग तरह का डेटा प्रदर्शित करना और देखने से डेटा दर्ज करने तक स्विच करना।


दिलचस्प बात यह है कि वीडियो का शीर्षक है "व्हाई वी वी
डोन्ट

यह एक अच्छा तरीका है, मैं एकल गतिविधि कई टुकड़े के साथ समस्याओं का सामना कर रहा हूँ ... वास्तविक ऍक्स्प शायद
GvSharma

4

इस पद्धति के साथ एक समस्या यह है कि आप मुख्य टैबलेट गतिविधि में और अलग फोन गतिविधियों में बहुत सारे तर्क नकल करते हैं।

मास्टर-डिटेल पैटर्न में, दो गतिविधियाँ होती हैं। एक बड़ी स्क्रीन पर दोनों टुकड़े दिखाता है और केवल छोटे पर्दे पर "मास्टर" टुकड़ा है। अन्य छोटे स्क्रीन पर "विस्तार" टुकड़ा दिखाता है।

आपके विवरण तर्क को विस्तार के टुकड़े में बांधा जाना चाहिए। इसलिए, गतिविधियों के बीच विस्तार तर्क से संबंधित कोई कोड दोहराव नहीं है - विस्तार गतिविधि केवल विस्तार टुकड़ा प्रदर्शित करती है, शायद एक Intentअतिरिक्त से डेटा में गुजर रहा है ।

इसके अलावा मैंने ActionBarSherlock के बारे में जो पढ़ा है वह यह है कि यह गतिविधियों के बजाय Fragments के साथ सबसे अच्छा काम करता है (लेकिन मैंने अभी तक इसके साथ काम नहीं किया है)।

ActionBarSherlock का देशी एक्शन बार की तुलना में टुकड़ों से कोई लेना-देना नहीं है, क्योंकि ActionBarSherlock पूरी तरह से देशी एक्शन बार का बैकपोर्ट है।


किसी एक गतिविधि के विचार पर आपके विचार क्या हैं?
दिबांग

@mattblang: जब तक आप नेविगेशन को सही पाते हैं, तब तक इसमें कोई समस्या नहीं है।
कॉमन्सवेअर

1
मैंने एक एकल गतिविधि वास्तुकला को फिर से तैयार करने की कोशिश की है क्योंकि एक टुकड़े को बदलना बहुत तेजी से एक नई गतिविधि को लॉन्च करने की तुलना में है। मुझे ऐसा लग रहा है कि मैं इस तरह से बहुत सारे स्नैग में दौड़ रहा हूं । ज्यादातर उदाहरण मुझे ऑनलाइन मिले, खासकर मास्टर-डिटेल जैसे मल्टी-फ्रैगमेंट कॉन्फ़िगरेशन के लिए, एक भी गतिविधि का उपयोग नहीं करते हैं। इसलिए मैं थोड़ी दुविधा में हूं।
दिबांग

0

"क्या कई गतिविधियों में फोन एप्लिकेशन को विभाजित करने का कारण है?" - हाँ। यह बस उपलब्ध स्थान के लिए नीचे आता है, एक टैबलेट डेवलपर्स को अधिक जगह देता है, इस प्रकार डेवलपर्स को एक स्क्रीन पर अधिक डालने की अनुमति देता है। Android हमें बताता है कि गतिविधियाँ एक स्क्रीन प्रदान कर सकती हैं । तो आप टैबलेट पर 1 बड़ी स्क्रीन के साथ क्या कर सकते हैं, यह एक ऐसी चीज है जिसे फोन पर कई स्क्रीन पर फैलाना पड़ सकता है, क्योंकि सभी टुकड़ों के लिए पर्याप्त जगह नहीं है।


1 वाक्य - "एक गतिविधि एक अनुप्रयोग घटक है जो एक स्क्रीन प्रदान करता है जिसके साथ उपयोगकर्ता कुछ करने के लिए बातचीत कर सकते हैं,"। मुझे अपने मूल कथन में एक त्रुटि दिखाई देती है, मेरा मतलब "दूसरी स्क्रीन नहीं है"
EFlisio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.