मैं कॉमन्सवेयर की टिप्पणी को उत्तर में बदलना चाहता हूं। मैं तब समझाऊंगा कि अंतिम निर्देशिका सेटअप कैसा दिखना चाहिए। मुझे उम्मीद है कि इससे लोगों को इस प्रश्न पर खोज के दौरान ठोकर खाई जाएगी।
ठीक है, आप स्वादों में संसाधनों को ओवरराइड कर सकते हैं। तो, main/res/layout/
में और yourFlavorHere/res/layout/
में स्वाद-विशिष्ट एक सामान्य है।
तो, अगर Customization
गतिविधि के लेआउट फ़ाइल activity_customization.xml
कहा जाता है, तो आप अपने सामान्य प्रतिलिपि तीन प्रकार के बीच साझा src/main/res/layout
निर्देशिका के अंतर्गत छोड़ने के लिए और संशोधित लेआउट एक्सएमएल द्वारा प्रयोग की जाने लगा देंगे, flavorFour
कहते हैं, उससे संबंधित के तहत स्रोत सेट निर्देशिका src/flavorFour/res/layout
।
जिस तरह से यह काम करता है वह है कि स्वाद एक से तीन (स्वाद चार के विपरीत) ने activity_customization.xml
के अपने संस्करण प्रदान नहीं किए हैं, वे main
स्रोत सेट से आने वाले व्यक्ति का वारिस करेंगे।
यह गतिविधि जावा क्लास है जो मुश्किल हो जाती है। के लिए एक और संभावना है कि दो स्रोत निर्देशिकाओं से खींचने के लिए समान गतिविधि कार्यान्वयन के साथ स्वादों को कॉन्फ़िगर करना है: एक स्वाद-विशिष्ट एक और सामान्य वर्ग कार्यान्वयन के साथ आम है।
संसाधनों के विपरीत, जावा कोड फ़ाइलों को विलय या ओवरराइड नहीं किया जाता है। इसलिए, आपके पास main
के साथ-साथ आपके किसी भी स्वाद स्रोत सेट के तहत पूरी तरह से योग्य क्लास नाम के साथ जावा फ़ाइलें नहीं हो सकती हैं। यदि आप करते हैं, तो आपको डुप्लिकेट क्लास त्रुटि प्राप्त होगी।
इस समस्या को हल करने के लिए, सबसे आसान समाधान Customization
main
से बाहर गतिविधि और प्रत्येक स्वाद स्रोत सेट में स्थानांतरित करना है। यह काम करता है क्योंकि स्वाद निर्देशिका पारस्परिक रूप से अनन्य होती है (एक दूसरे के साथ, 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
कुछ ऐसा दिखाई देगा कफ बंद: '' CustomizationBase' आम सामग्री के साथ main' में है। 'कस्टमाइज़ेशन' है जो कि 'अनुकूलनबेस' से प्राप्त होता है और कुछ भी नहीं, तीन स्वादों में डुप्लिकेट किया जाता है। 'अनुकूलन' है जो चौथे स्वाद में आवश्यकतानुसार 'अनुकूलनबेस' को ओवरराइड करता है। – CommonsWare
@ कॉमन्सवेयर क्षमा करें, मेरी गलती, मैंने इसे अच्छी तरह से समझाया नहीं। यह अनुकूलन वर्ग वास्तव में एक गतिविधि है, जिसमें उनमें से 3 के लिए एक ही लेआउट है और अंतिम के लिए एक अलग है। क्या आपको लगता है कि मैं इस मामले में ऐसा कुछ भी लागू कर सकता हूं? – kenny
ठीक है, बस यह सुनिश्चित करने के लिए कि मैं इसे समझता हूं: तीन स्वादों के बीच सामान्य में एक फ़ाइल एक लेआउट संसाधन है? – CommonsWare