2012-04-07 9 views
19

मेरे पास एक एंड्रॉइड लाइब्रेरी है MyLib जिसमें मेरे ऐप के लिए आवश्यक सब कुछ है (एंड्रॉइड 2.2 को लक्षित करना)।आवेदन में पीएनजी संसाधन के साथ लाइब्रेरी के एक्सएमएल संसाधन को ओवरराइड नहीं कर सकता?

drawable/main_background.xml 

मेरी आवेदन MyApp परियोजना में मैं संदर्भ MyLib: यह पुस्तकालय एक XML संसाधन है। यहां मैं विशिष्ट संसाधनों को ओवरराइड करना चाहता हूं (यानी ब्रांडिंग)। इसलिए मैं MyApp में एक पृष्ठभूमि छवि कहा:

[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. 
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

मैं पुस्तकालय परियोजना में संसाधन कैसे ओवरराइड कर सकते हैं:

drawable/main_background.png 

ग्रहण मुझे इस त्रुटि दे रही रखता है?

+0

क्या आपको अभी तक इस समस्या का कोई समाधान मिला है? – Sam

+0

क्षमा करें। मैंने इस पर छोड़ दिया। आखिरकार मैंने एक पीएनजी बनाया जो मेरे एक्सएमएल की तरह दिखता था। मैं अभी भी परेशान हूं कि मुझे उन केबी को बर्बाद करना पड़ा :) – l33t

उत्तर

10

आप एंड्रॉइड एसडीके में अलग-अलग एक्सटेंशन वाली फ़ाइल के साथ संसाधन आईडी को ओवरराइड नहीं कर सकते हैं (यह संसाधन आईडी है जिसे आप ओवरराइड कर रहे हैं, वास्तविक फ़ाइल नहीं)। हालांकि, आप अपनी प्रोजेक्ट xml फ़ाइल को उसी नाम (main_background.xml) के साथ डालकर चाल कर सकते हैं और अपनी नई फ़ाइल (main_background.png) प्रदर्शित करने के लिए इसे उचित तरीके से भर सकते हैं, जिसे आपको पहले नाम बदलने की आवश्यकता है। सभी वाक्य रचना आप की जरूरत यहाँ descibed है:

http://developer.android.com/guide/topics/resources/drawable-resource.html

, आपके मामले में यह किया जा सकता है बस (आप main_background.xml के रूप में अपने गैर पुस्तकालय परियोजना में रखते हैं, और आप main_background_new.png रूप में अपने नए png है यह सोचते हैं):

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/main_background_new" /> 

उपर्युक्त समाधान के साथ, आप अपनी परियोजना से @drawable/main_background देख सकते हैं और इसे पुस्तकालय के बजाय उस प्रोजेक्ट के साथ आपकी फ़ाइल का उपयोग करना चाहिए।

+1

हाय, हाँ मैं इसे समझता हूं, यह मेरे उत्तर में पोस्ट किए गए उदाहरण के समान है, लेकिन एपीआई बताता है कि आपके पास resouce आईडी को ओवरराइड करने की क्षमता है (यह एक्सटेंशन पर टिप्पणी नहीं करता है) , इसलिए, ईमानदार होने के लिए, मुझे लगता है कि यह एक बग रिपोर्ट के योग्य है। – Sam

+0

हाय, मैंने आपको बक्षीस से सम्मानित किया क्योंकि आपने मेरे पोस्ट में उल्लिखित कार्यवाही में सुधार प्रदान किया था। हालांकि, मुझे पूरा यकीन है कि एक्सटेंशन के बावजूद संसाधन आईडी को ओवरराइड करने में सक्षम होना चाहिए, इसलिए मुझे लगता है कि जब मैं – Sam

+0

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

3

तो एक इस समस्या है, जो मैं एक जवाब पर विचार नहीं है करने के लिए 'समाधान' है निम्नलिखित:

एक XML दस्तावेज को परिभाषित करें प्रश्न में पुस्तकालय में (हम इसे bunny.xml फोन करता हूँ) , और यह प्रदर्शित होने वाली वास्तविक सामग्री के साथ एक समान नाम (bunny_drawn.xml) के किसी अन्य XML को संदर्भित करता है।

फिर, लक्ष्य परियोजना में, दूसरे के साथ bunny.xml ओवरराइड और इसका इस्तेमाल करने के बजाय एक अलग नाम के साथ एक छवि का उल्लेख करने के -

bunny_image.png हालांकि यह समस्या का समाधान नहीं होता है, सबसे पहले, क्योंकि हम नहीं कर रहे तकनीकी रूप से एक एक्सएमएल के साथ एक पीएनजी ओवरराइड नहीं कर रहा है (हालांकि प्रभाव कुछ हद तक करीब है)। है दूसरी बात, क्योंकि संसाधनों अधिभावी की प्रमुख विशेषताओं में से एक वे अधिरोहित कर रहे हैं, यानी वे APK में संकलित नहीं हैं:

the tools ensure that the resource declared in the application gets priority and that the resource in the library project is not compiled into the application .apk

लेकिन bunny_drawn.xml अभी भी में संकलित किया जाएगा! हम लक्ष्य को एपीपी में प्रतिस्थापित करने के लिए न केवल दूसरी बिंदु को पार कर सकते हैं, बल्कि पुराने लक्ष्य bunny_drawn.xml को रिक्त xml के साथ बदल सकते हैं। (या, जैसा कि फेनिक्स ने इंगित किया है, आप पहले मामले में bunny.xml के अंदर bunny_drawn.xml की सामग्री प्राप्त कर सकते हैं - तथ्य यह है कि संसाधन आईडी को प्रतिस्थापित नहीं किया जा सकता है ...)

तो मेरा अंतिम निष्कर्ष यह है कि डेवलपर टूल्स में बग के रूप में इसे प्रस्तुत करने की आवश्यकता है।

4
[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined. 
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here. 

मुझे विश्वास नहीं है कि आपके पास अलग-अलग एक्सटेंशन के साथ भी एक ही फ़ाइल नाम हो सकता है। कुछ और पीएनजी नामकरण का प्रयास करें।

अब, मैंने ओवरराइडिंग का उपयोग नहीं किया है, इसलिए यह अजीब लगता है क्योंकि आप यह उम्मीद करते हैं कि आप इस संपत्ति को कैसे ओवरराइड करते हैं। हालांकि मुझे लगता है कि आपको या तो अपने lib में दो संपत्तियां मिल गई हैं। और यह कि आपकी परियोजना में एक ही नाम के साथ एक संपत्ति होना ठीक हो सकता है। हालांकि मैं जांच करता हूं कि यह अलग-अलग प्रकार के लिए ठीक है। एक्सएमएल पीएनजी से अलग है, और यदि आप कोड से संपत्ति तक पहुंचते हैं तो आपको टाइप त्रुटियां मिल सकती हैं।

मुझे उपरोक्त बिंदु को स्पष्ट करने दें। मैं समझता हूं कि एक लाइब्रेरी प्रोजेक्ट में आपके एप्लिकेशन में एक आइटम के समान संसाधन आईडी वाला आइटम हो सकता है।

हालांकि ऊपर दी गई त्रुटि से पता चलता है कि main_background.png और main_background.xml दोनों एक ही प्रोजेक्ट ([com.mycom.mylib.myapp]) में हैं जो मुझे विश्वास नहीं है कि सही है।

अतिरिक्त पठन

यह पृष्ठ पुस्तकालय परियोजना http://developer.android.com/tools/projects/index.html

अब मैं नहीं जानता कि मैं कहाँ से छाप मिल गया लेकिन देखा होने फिर से यह बस नहीं है सहित परियोजना के विभिन्न प्रकार का वर्णन करता है कहीं भी राज्य करें कि आप एक ही संसाधन नाम का उपयोग कर संसाधन को ओवरराइड कर सकते हैं। भगवान जानता है क्यों मैंने सोचा कि यह एक विशेषता थी।

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

समझाया गया है कि संसाधन संघर्ष कैसे प्रबंधित किए जाते हैं।

Resource conflicts Since the tools merge the resources of a library project with those of a dependent application project, a given resource ID might be defined in both projects. In this case, the tools select the resource from the application, or the library with highest priority, and discard the other resource. As you develop your applications, be aware that common resource IDs are likely to be defined in more than one project and will be merged, with the resource from the application or highest-priority library taking precedence.

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

मैंने कहीं भी नहीं पढ़ा है कि यह वास्तव में एक इच्छित विशेषता है। अन्यथा कहने के लिए कोई लिंक मिला? (उन्हें टिप्पणी करें)

+0

वैसे यह आपके उद्धरण और बाउंटी टिप्पणी में एपीआई उद्धरण के अनुसार लाइब्रेरी प्रोजेक्ट्स की 'फीचर' या कम से कम 'संपत्ति' माना जाता है। यह संसाधनों के लिए एक समान नाम (एक्सटेंशन सहित) के साथ काम करेगा, लेकिन यह संसाधन आईडी नहीं है - जो कि आप लेआउट में संदर्भित करते हैं। – Sam

+0

भी, भले ही ओपी के पास एक ही प्रोजेक्ट में संसाधन हों, मैंने निश्चित रूप से नहीं किया, और एक ही समस्या थी। इसलिए यदि आपको अलग-अलग पुस्तकालयों में समान नाम (लेकिन अलग-अलग एक्सटेंशन) के संसाधनों के साथ एक कंपाइलर त्रुटि मिलती है, तो क्या आप सहमत हैं कि इसे डेवलपर टूल बग के रूप में रिपोर्ट किया जाना चाहिए? – Sam

+0

हां, लेकिन मुझे यह भी पता है कि संसाधन आईडी के साथ संसाधन आईडी के लिंकिंग/सेटअप के कारण संघर्ष करने में कोई समस्या है, जो मुद्दा है, मुझे बस एसओ पोस्ट नहीं मिल रहा है जो इससे संबंधित है। इसे एक मुद्दे के रूप में उठाएं। – Emile

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