व्यू के बजाय एंड्रॉइड में फ्रेग्मेंट का उपयोग करने का क्या लाभ है?


102

के लिए विकसित करते समय Android, आप अपना लक्ष्य (या न्यूनतम) sdk को 4 (API 1.6) पर सेट कर सकते हैं और समर्थन जोड़ने के लिए Android संगतता पैकेज (v4) जोड़ सकते हैं Fragments। कल मैंने ऐसा किया और Fragmentsएक कस्टम वर्ग के डेटा की कल्पना करने के लिए सफलतापूर्वक लागू किया।

मेरा सवाल यह है: Fragmentsएक कस्टम ऑब्जेक्ट से केवल एक दृश्य प्राप्त करने के लिए विरोध करने के लिए उपयोग करने के लिए क्या लाभ है , और अभी भी एपीआई 1.5 का समर्थन कर रहा है?

उदाहरण के लिए, कहो कि मेरे पास वर्ग Foo.java है:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

बनाने के लिए और एक गतिविधि में काम करने के लिए दोनों तरीके बहुत सरल हैं, जो कहते हैं, एक List<Foo>को प्रदर्शित करना है (उदाहरण के लिए, प्रोग्रामेटिक रूप से प्रत्येक को जोड़ना ScrollView), तो Fragmentsवास्तव में ये सभी उपयोगी हैं, या क्या वे केवल एक अति-महिमा वाले सरलीकरण हैं एक दृश्य प्राप्त करना, जैसे कि ऊपर दिए गए कोड के माध्यम से?


2
टुकड़े के पास UI नहीं है, वे बस पुन: प्रयोज्य व्यवहार कर सकते हैं। एक दृश्य उस मामले में बेमानी होगा।
फिलिप रीचर्ट

मैंने एक अन्य प्रश्न में इसका उत्तर दिया है। देखें stackoverflow.com/a/14912608/909956 टी; ड्र - कभी-कभी टुकड़े आपको कस्टम दृश्य कार्यान्वयन पर भरोसा करने से अधिक पुन: प्रयोज्य घटकों को बनाने की अनुमति देते हैं। क्यों के लिए लिंक देखें।
अंकन सलाति

जवाबों:


172

Fragments का उपयोग करने का मुख्य कारण बैकस्ट और जीवनचक्र सुविधाओं के लिए है। अन्यथा, कस्टम दृश्य अधिक हल्के वजन और लागू करने के लिए सरल हैं।

सबसे पहले, मैंने वास्तव में कस्टम विचारों का उपयोग करके एक फोन / टैबलेट ऐप बनाने की कोशिश की। सब कुछ फोन और टैबलेट पर काम करने के लिए दिखाई दिया , यहां तक ​​कि एकल पैनल से विभाजित पैनल पर स्विच करना। जहां मैं मुसीबत में था पीछे बटन और जीवन चक्र के साथ। चूंकि मैं केवल विचारों को मैन्युअल रूप से अपडेट कर रहा था ... विचारों और उनके राज्यों के इतिहास पर नज़र रखने के लिए कुछ भी नहीं था। इसलिए, बैक बटन अपेक्षा के अनुरूप काम नहीं करता था और जीवन चक्र की घटनाओं के दौरान नवीनतम स्थिति को फिर से बनाना मुश्किल था, जैसे कि ऐप को घुमाते समय। इसे ठीक करने के लिए, मुझे अपने कस्टम विचारों को टुकड़ों में लपेटना होगा और FragmentManager का उपयोग करना होगा ताकि पिछले राज्यों को बचाया और फिर से बनाया जा सके।

मुझे जवाब देने के बाद एहसास हुआ कि मैंने एक साल पहले इसी तरह के प्रश्न पर पोस्ट किया था: https://stackoverflow.com/a/11126397/618881


14
बहुत अच्छा जवाब। मैं बस को जोड़ने के लिए है कि टुकड़े नेस्ट किया जा सकता है 4.2 या समर्थन पुस्तकालय राजस्व 11 के बाद से चाहता था
कर

2
अपडेट के लिए धन्यवाद @ कर्लो। मुझे नहीं लगा कि यह वैचारिक रूप से संभव था, लेकिन उन्होंने getChildFragmentManager () के माध्यम से एक निजी FragmentManager का उपयोग करके इसके चारों ओर काम किया। ओह, और यह एपीआई 17 है, 11 नहीं, और समर्थन पुस्तकालय के माध्यम से उपलब्ध है।
हेनरी

2
मैं बस फिर से इस सवाल को देख रहा था, और मेरा अनुभव भी बदल गया है। यह एक उत्तर है जो लाभ और कमियां दोनों की अच्छी समझ प्रदान करता है, और बहुत मददगार है। धन्यवाद!
फिल

2
इस उत्तर को +1 करना चाहते हैं, लेकिन ऐसा करने से वर्तमान स्कोर नष्ट हो जाएगा। इसके अलावा, 70 मेरा पसंदीदा नंबर नहीं है।
बेहनम

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

27

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

एक और उपयोग मामला पुन: प्रयोज्य दृश्य हैं। इसलिए यदि आपके पास कुछ ऐसे विचार हैं जो विभिन्न गतिविधियों पर दिखाई देते हैं और कुछ कार्य भी करते हैं जो आप इस व्यवहार को एक खंड में डाल सकते हैं और फिर इसका उपयोग कर सकते हैं। जाहिर है आप शायद कस्टम विजेट के साथ भी ऐसा कर सकते हैं।

मैं हर दृश्य के लिए फ़्रैगमेंट का उपयोग करने का कोई कारण नहीं देखूंगा और मुझे लगता है कि यह सिर्फ एक ओवरहेड होगा। मैं केवल पहले उपयोग के मामले में उनका उपयोग कर रहा हूं और मैं कहूंगा कि यह एक सरलीकरण है।


धन्यवाद, यह निश्चित रूप से सहायक था। मुझे लगता है कि मैं विचारों के साथ रहूंगा और उन्हें पुन: प्रयोज्य बनाने के लिए अपना खुद का 'बैक स्टैक' बनाऊंगा।
फिल

3

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

यहाँ आप और अधिक पढ़ सकते हैं।


मैंने सभी दस्तावेज पढ़े हैं, हालाँकि मैं कुछ ऐसी चीज़ों की तलाश में था जो उनके लाभ को बेहतर ढंग से समझाती हों, जैसे कि टैबलेट या बैकस्टैक के लिए
फिल

3
  1. परिदृश्य गतिविधि स्प्लिट स्क्रीन - हमारे पास एक लेआउट और एक गतिविधि है जो बाएं दाएं स्क्रीन भाग को संभालती है
  2. परिदृश्य FragmentActivity हमारे पास मुख्य स्क्रीन के लिए एक लेआउट है, एक दाएं के लिए एक बाएं के लिए है

यदि आपके पास सरल अनुप्रयोग है, तो परिदृश्य अच्छा है।

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

मेरे पास विभाजित स्क्रीन है Fragmentactivity मैं इसे 'Intent Extras' के साथ कॉल कर सकता हूं और टुकड़ा को बता सकता हूं कि कौन सा टुकड़ा लोड किया जाना है। टुकड़े अच्छे हैं क्योंकि वे प्रकट नहीं हैं इसलिए आप पुन: प्रयोज्य टुकड़े और FragmentActvity बना सकते हैं।

लेकिन यह आपके प्रोजेक्ट को बड़ा बनाता है। लेकिन अगर आप बड़ी परियोजना बनाते हैं तो आप कई बचत कर सकते हैं। क्योंकि आप समान फ्रैगमेंट या समान फ्रैगमेंट गतिविधि का उपयोग कर सकते हैं।

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

इसके उपयोगी लेकिन मैं नहीं जानता कि अभी कैसे। लेकिन मेरे पास कुछ विचार हैं।

यह हमेशा समस्या है। एंड्रॉइड टीम ने सोमेथिंक बनाया और किसी को नहीं पता कि इसके लिए क्या अच्छा है। क्योंकि हम शायद ही सीखते हैं जैसे यह था और यहाँ कुछ नई चीजें आती हैं।

मेरी राय में यह अच्छा है लेकिन इस कारण से नहीं कि Google हमें बताए।


0

CustomView पर Fragment या गतिविधि का उपयोग करते समय एक मामला जोड़ें:

जब आप कुछ दृश्य, सूची दृश्य या टेक्स्ट दृश्य देखने के लिए CursorLoader का उपयोग कर रहे हैं और जब भी आपके ContentProvider के डेटा अपडेट्स बैक एंड (सबसे सामान्य स्थिति में आपके पास एक सेवा होती है जो आपके डेटाबेस को दूरस्थ डेटाबेस / क्लाउड से समय-समय पर डेटा को अपडेट करके अपडेट करते हैं, तो उनके प्रदर्शन मूल्य को अपडेट करना चाहते हैं। )


-2

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

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