2015-07-30 2 views
19

2 जायके के साथ एक Android एप्लिकेशन है। स्वाद 1, और स्वाद 2 निर्देशिकाओं का अपना स्रोत सेट होता है, जो धीरे-धीरे स्वचालित हो जाता है। यदि मैं स्वाद निर्देशिका में संसाधन फ़ाइल जोड़ता हूं तो यह इसे मुख्य से ओवरराइड करता है, और ठीक काम करता है।विभिन्न एंड्रॉइड स्वादों में जावा कक्षाओं को ओवरराइड क्यों नहीं किया जाएगा? -flavor1 -flavor2</p> <p>मेरे निर्देशिका वृक्ष है:</p> <pre><code>/src/main /src/flavor1 /src/flavor2 </code></pre> <p>मुख्य है डिफ़ॉल्ट स्रोत सेट

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

क्या कोई तरीका है कि मैं जावा फाइलों को संसाधन फ़ाइलों की तरह ओवरराइड कर सकता हूं? ऐसा क्यों होता है?

+2

"क्या कोई तरीका है कि मैं जावा फाइलों को संसाधन फ़ाइलों की तरह ओवरराइड कर सकता हूं?" - AFAIK, नहीं। "ऐसा क्यों होता है?" - AFAIK, जो जावा कोड के लिए मानक ग्रैडल स्रोत व्यवहार है। – CommonsWare

उत्तर

27

क्या कोई तरीका है कि मैं संसाधनों की तरह जावा कक्षाओं को ओवरराइड कर सकता हूं?

नहीं। एंड्रॉइड टूल टीम के जेवियर ड्यूक्रॉएट ने कुछ संक्षिप्त here पर चर्चा की।

हालांकि आप जो चाहते हैं उसे पूरा करने के तरीके हैं- उस पर और अधिक।

ऐसा क्यों होता है?

आपके जावा कोड को संकलित करने की आवश्यकता है। मान लें कि आप अपने main स्रोत सेट में अन्य कक्षाओं से Foo को संदर्भित करते हैं, Foo कक्षा में एक ही सार्वजनिक एपीआई होना चाहिए चाहे स्वाद का संकलन क्यों किया जा रहा हो। यदि आप स्वाद-विशिष्ट Foo के साथ मुख्य Foo को पूरी तरह से प्रतिस्थापित करने में सक्षम थे, तो यह सच नहीं हो सकता है। यह निश्चित रूप से उपकरण के साथ हल करने के लिए एक असंभव समस्या नहीं है, लेकिन वर्तमान निर्माण उपकरण का समाधान आपको ऐसा करने की अनुमति नहीं देना है।

बेशक छवियों जैसे संसाधनों के साथ, यह पूरी तरह से अलग है - जब तक संसाधन का कुछ संस्करण मौजूद है, एंड्रॉइड इसे ठीक से उपयोग कर सकता है।

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

+0

धन्यवाद! बहुत उपयोगी और पूरा जवाब –

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