2015-02-17 14 views
38

मैं अपने एंड्रॉइड ऐप के 4 अलग-अलग स्वादों का निर्माण कर रहा हूं।विभिन्न एंड्रॉइड स्वाद के लिए सामान्य कोड

मैं एक वर्ग Customization.java है कि उनमें से 3 के लिए एक ही है और के लिए 1.

अलग है जब से मैं एक ही कक्षा दोनों मुख्य फ़ोल्डर में और स्वाद फ़ोल्डर में नहीं डाल सकते हैं, मैं अब 3 को बनाए रखने के लिए है उन 3 स्वादों के लिए सटीक उसी वर्ग की प्रतियां।

क्या कोई तरीका है कि मैं इस वर्ग के केवल दो संस्करणों को रखने के साथ कर सकता हूं?

चीजें मैं अब तक पर विचार किया है:

  1. मैं स्वाद आयामों को देखा है, लेकिन वे इस मामले में लागू नहीं हैं पता चला है।
  2. स्वादों में से केवल एक फ़ाइल को रखना और इसे मेरी बिल्ड स्क्रिप्ट के माध्यम से कॉपी करना।

मुझे आश्चर्य है कि बॉक्स से कुछ क्लीनर है या नहीं।

+1

कुछ ऐसा दिखाई देगा कफ बंद: '' CustomizationBase' आम सामग्री के साथ main' में है। 'कस्टमाइज़ेशन' है जो कि 'अनुकूलनबेस' से प्राप्त होता है और कुछ भी नहीं, तीन स्वादों में डुप्लिकेट किया जाता है। 'अनुकूलन' है जो चौथे स्वाद में आवश्यकतानुसार 'अनुकूलनबेस' को ओवरराइड करता है। – CommonsWare

+0

@ कॉमन्सवेयर क्षमा करें, मेरी गलती, मैंने इसे अच्छी तरह से समझाया नहीं। यह अनुकूलन वर्ग वास्तव में एक गतिविधि है, जिसमें उनमें से 3 के लिए एक ही लेआउट है और अंतिम के लिए एक अलग है। क्या आपको लगता है कि मैं इस मामले में ऐसा कुछ भी लागू कर सकता हूं? – kenny

+0

ठीक है, बस यह सुनिश्चित करने के लिए कि मैं इसे समझता हूं: तीन स्वादों के बीच सामान्य में एक फ़ाइल एक लेआउट संसाधन है? – CommonsWare

उत्तर

81

मैं कॉमन्सवेयर की टिप्पणी को उत्तर में बदलना चाहता हूं। मैं तब समझाऊंगा कि अंतिम निर्देशिका सेटअप कैसा दिखना चाहिए। मुझे उम्मीद है कि इससे लोगों को इस प्रश्न पर खोज के दौरान ठोकर खाई जाएगी।

ठीक है, आप स्वादों में संसाधनों को ओवरराइड कर सकते हैं। तो, main/res/layout/ में और yourFlavorHere/res/layout/ में स्वाद-विशिष्ट एक सामान्य है।

तो, अगर Customization गतिविधि के लेआउट फ़ाइल activity_customization.xml कहा जाता है, तो आप अपने सामान्य प्रतिलिपि तीन प्रकार के बीच साझा src/main/res/layout निर्देशिका के अंतर्गत छोड़ने के लिए और संशोधित लेआउट एक्सएमएल द्वारा प्रयोग की जाने लगा देंगे, flavorFour कहते हैं, उससे संबंधित के तहत स्रोत सेट निर्देशिका src/flavorFour/res/layout

जिस तरह से यह काम करता है वह है कि स्वाद एक से तीन (स्वाद चार के विपरीत) ने activity_customization.xml के अपने संस्करण प्रदान नहीं किए हैं, वे main स्रोत सेट से आने वाले व्यक्ति का वारिस करेंगे।

यह गतिविधि जावा क्लास है जो मुश्किल हो जाती है। के लिए एक और संभावना है कि दो स्रोत निर्देशिकाओं से खींचने के लिए समान गतिविधि कार्यान्वयन के साथ स्वादों को कॉन्फ़िगर करना है: एक स्वाद-विशिष्ट एक और सामान्य वर्ग कार्यान्वयन के साथ आम है।

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

इस समस्या को हल करने के लिए, सबसे आसान समाधान Customizationmain से बाहर गतिविधि और प्रत्येक स्वाद स्रोत सेट में स्थानांतरित करना है। यह काम करता है क्योंकि स्वाद निर्देशिका पारस्परिक रूप से अनन्य होती है (एक दूसरे के साथ, main के साथ नहीं) इसलिए संघर्ष से परहेज करते हैं।

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

तो, build.gradle स्क्रिप्ट की तरह

android { 
    ... 
    productFlavors { 
     flavorOne { 
      ... 
     } 
     flavorTwo { 
      ... 
     } 
     flavorThree { 
      ... 
     } 
     flavorFour { 
      ... 
     } 
    } 
    sourceSets { 
     flavorOne.java.srcDir 'src/common/java' 
     flavorTwo.java.srcDir 'src/common/java' 
     flavorThree.java.srcDir 'src/common/java' 
    } 
} 

सूचना कुछ ऐसा दिखाई देगा java.srcDir (और नहीं srcDirs) के उपयोग जो एक और जावा स्रोत निर्देशिका कहते हैं पहले से ही विद्यमान डिफ़ॉल्ट src/flavorX/java करने के लिए।

अब हमें केवल गतिविधि फ़ाइल को src/common/java में स्वाद के लिए उपलब्ध कराने के लिए सामान्य फ़ाइल को छोड़ना है। flavorFour द्वारा आवश्यक संशोधित संस्करण src/flavorFour/java पर अपने स्रोत सेट के तहत जाएगा।

तो, अंतिम परियोजना संरचना की तरह

+ App // module 
|- src 
    |- common // shared srcDir 
     |- java 
     |- path/to/pkg 
     |- CustomizationActivity.java // inherited by flavors 1, 2, 3 
    + flavorOne 
    + flavorTwo 
    + flavorThree 
    + flavorFour 
     |- java 
     |- path/to/pkg 
     |- CustomizationActivity.java // per-flavor activity class 
     |- res 
     |- layout 
      |- activity_customization.xml // overrides src/main/res/layout 
    |- main 
     + java 
     |- res 
     |- layout 
      |- activity_customization.xml // inherited by flavors 1, 2, 3 
+0

अच्छी व्याख्या और बिंदु पर। धन्यवाद! इससे मदद मिली – AndroidMechanic

+0

यह वास्तव में शक्तिशाली है और जब हुक विधियों को और भी प्रदान करने के लिए विरासत के साथ संयुक्त किया जाता है! साझा करने के लिए धन्यवाद! – narko

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