11

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

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

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentAlertDialog.html

लेकिन यह टुकड़ा अभी भी लागू किया गया है और भारी activty (संवाद का बटन कार्रवाई गतिविधि में है) के साथ मिलकर।

तो मॉडल और दृश्य भारी मिश्रित हैं। मुझे बनाए रखने के लिए इतनी मेहनत, स्थिर कोड में एक अतिरिक्त मूल्य नहीं दिख रहा है ?!

टुकड़ों के बारे में आपकी राय और सलाह क्या है?

+0

मैं डॉन 'के घंटे बचा सकते हैं उत्तर देने के लिए पर्याप्त अनुभव नहीं है, लेकिन टुकड़ों पर मेरा पहला पास मुझे गैर-टैबलेट ऐप्स में उनके उपयोग पर सवाल उठाता है। यूआई देव में मामूली सुधार के लिए निश्चित रूप से जटिलता में वृद्धि। – tcarvin

उत्तर

23

जब Fragments उपयोग कर, आप View और Activity जा रहा है Controller होने के रूप में के रूप में उनमें से लगता है कि कर सकते हैं । मेरी व्यक्तिगत राय में, फ्रैगमेंट्स टैबलेट का समर्थन करने के लिए Google की घुटने की झटके प्रतिक्रिया थीं, और अब हम उनके साथ फंस गए हैं :(

मैं हर रोज टुकड़ों का उपयोग करता हूं, और मुझे निश्चित रूप से आपका दर्द महसूस होता है। जब मैंने पहली बार उनके बारे में पढ़ा तो मैंने खुद को सोचा , "यह वास्तव में अच्छा है", लेकिन उन्हें उपयोग करने के बाद, वे कम इतना तो कई मायनों में गिर जाते हैं, लेकिन मुख्य रूप से क्योंकि मैं उन्हें का प्रयोग करेंगे गलत तरीके से :(

यहाँ नुकसान का सामना करना पड़ा है कि मैं से कुछ हैं ...

  1. अपने टुकड़े लेआउट में onclick का उपयोग न करें, क्योंकि यह Activity है औरनहीं है 10 जो क्लिक को संभालेगा। यदि आप विशेषता का उपयोग करते हैं, और बाद में आप Activity में खंड का उपयोग करते हैं, तो आपको onclick विधि को उस Activity पर भी जोड़ना होगा। तो, findViewById का उपयोग करें और उसके बाद खंड के onCreateView में मैन्युअल रूप से क्लिक हैंडलर संलग्न करें।

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

  3. केवल टुकड़ों का उपयोग करके एक पूर्ण आवेदन न बनाएं। इसके बजाय गतिविधियां का उपयोग करके सामान्य रूप से आपके जैसे ऐप्स बनाएं और फिर Fragment का एक शानदार दृश्य (जो यह है) का इलाज करें। यानी, ऐप को डिज़ाइन करें कि आपके पास कई टुकड़े और एकाधिक गतिविधियां हैं, और कुछ गतिविधियां 1 से अधिक खंड का उपयोग कर सकती हैं।

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

नीचे पंक्ति है अगर आप उन्हें एक View के रूप में उपयोग कि टुकड़े महान हैं, लेकिन अगर आप उन्हें क्रियाएँ की तरह उपयोग करने के लिए कोशिश कर रहा शुरू करते हैं, तो आप समस्या में पड़ जा रहे हैं :(Activiy के बारे में सोचो - जा रहा है के रूप में>FragmentController ->View

मैं सुझाव है कि आप पढ़ सकते हैं और गतिविधि जीवनचक्र के अलावा टुकड़ा जीवन चक्र को समझने (प्रो एंड्रॉयड 4 यह प्रतिनिधित्व करने के लिए एक महान तस्वीर है) और तुम अपने आप को दर्द :)

+0

आपकी सलाह के लिए धन्यवाद। 1 के अनुसार 0 .: मैं फ्रैगमेंट में ऑनक्लिकलिस्टर्स को लागू करता हूं। कभी-कभी केवल टुकड़े को संशोधित करता है। इसके अलावा मैं सामान्य रूप से प्रत्येक खंड में एक सार्वजनिक श्रोता इंटरफ़ेस को कार्यान्वित करता हूं और इसे उस गतिविधि में कार्यान्वित करता हूं जो खंड का उपयोग कर रहा है। इस दृष्टिकोण के साथ मैं गतिविधि पर किसी अन्य श्रोता के माध्यम से ऑनक्लिकलिस्टर को स्थानांतरित कर सकता हूं सबसे पहले यह ओवरलोड हो जाता है लेकिन लाभ यह है कि मैं बटन आईडी की पहचान करने के लिए व्यू आईडी का उपयोग कर सकता हूं और केवल मेरी गतिविधि में श्रोता पर है जिसे जानने की आवश्यकता नहीं है मेरे टुकड़े में ui तत्व। –

+0

अच्छा विवरण और अच्छी सलाह। किसी भी तरह से मुझे लगता है कि यदि दृश्य लेआउट फ़ाइलों का उपयोग कर सकते हैं, और यदि कस्टम घटकों को आसान और प्रोत्साहित किया गया था तो हमें टुकड़ों की आवश्यकता नहीं होगी। हम गतिविधि == नियंत्रक, देखें == देखें। लेकिन किसी भी तरह से एंड्रॉइड आर्किटेक्ट्स द्वारा जल्दी ही याद किया गया। एक और सर्वोत्तम अभ्यास के रूप में टुकड़ों को क्लिक को संभालना चाहिए, घटनाओं को बदलना चाहिए, घटनाओं को स्पर्श करना चाहिए। फिर फ्रैगमेंट श्रोताओं को उजागर करता है जो व्यवसाय तर्क की तरह अधिक पढ़ते हैं: AuthenicateUser, ShareMovie, आदि। फिर आपकी गतिविधि को प्रदर्शित करने के लिए आपके द्वारा चुने गए घटकों से तलाक दिया जाता है। – chubbsondubs

+0

https://github.com/square/mortar – dnkoutso

7

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

मुझे लगता है कि आपके द्वारा प्रदान किया गया उदाहरण Fragments को डिजाइन करने के लिए एक त्वरित और गंदा दृष्टिकोण है। फ्रैगमेंट प्रतिनिधि को इंटरफ़ेस निकालने के द्वारा आप आसानी से पीछे संदर्भ (इस के घोंसला का दायरा) निकाल सकते हैं।

 fragment_userlocation_btn_addLocation.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      openLocInput().setOwnerActivity(getActivity()); 
      openLocInput().show(); 
     } 
    }); 

भी टुकड़े में लागू:

-1

ठीक है, मैं इसे mv वास्तुकला के साथ चल रहा है ...

public AlertDialog openLocInput() { 

    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
    alert.setTitle("Login"); 
    alert.setMessage("Enter Pin :"); 

    // Set an EditText view to get user input 
    final EditText input = new EditText(getActivity()); 
    alert.setView(input); 

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      jsonHandler.obtainMessage(1, input.getText().toString()) 
        .sendToTarget(); 
      dialog.dismiss(); 
      return; 
     } 
    }); 

    alert.setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        return; 
       } 
      }); 
    return alert.create(); 
} 

टुकड़ा में लागू ... टुकड़ा से इस alertdialog शुरू कर मिला है।

लेकिन मैं अभी भी overkill सिद्धांत में विश्वास ...

मुझे लगता है कि मेरी यूआई के < 5% दोबारा इस्तेमाल किया जाएगा, तो यह टुकड़े और टुकड़े बिना ui तर्क सहित गतिविधियों लोड हो रहा है गतिविधियों को मिश्रण करने की सिफारिश की है?

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

+0

यह पुन: उपयोग करने की बात है। भविष्यवाणी करना मुश्किल है कि आप इसका उपयोग कब करेंगे क्योंकि आप भविष्यवाणी की भविष्यवाणियों की भविष्यवाणी नहीं कर सकते हैं। जीवन में बहुत सी चीजों की तरह ही यदि आप इसे बहुत लंबे समय तक अनदेखा करते हैं तो आपके हाथों पर बहुत अधिक प्रोजेक्ट होता है, यदि आप धीरे-धीरे छोटे सुधार करते हैं। अपने घास को 10 साल के लिए कटौती न करें, इसे हर 2 सप्ताह में काट लें। किसी प्रकार की योजना होने का मतलब है कि आप अपने कार्यक्रम के मार्गदर्शन के लिए समय के साथ छोटे बदलाव कर सकते हैं। – chubbsondubs