2012-04-07 19 views
19

Uygulamam için ihtiyaç duyduğum her şeyi içeren bir Android kitaplığım var MyLib (Android 2.2'i hedefleme). Benim Uygulama MyApp projedeUygulamada png kaynağıyla kütüphanenin xml kaynağını geçersiz kılmıyor mu?

drawable/main_background.xml 

Ben MyLib başvuru: Bu kütüphane, bir XML kaynak vardır. Burada belirli kaynakları geçersiz kılmak istiyorum (yani marka bilinci oluşturmak). Bu yüzden MyApp arka plan resmi ekledi:

[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. 

nasıl kütüphane projesinde kaynak geçersiz kılabilirsiniz:

drawable/main_background.png 

Eclipse bana bu hatayı veren tutar?

+0

Bu soruna henüz bir çözüm buldunuz mu? – Sam

+0

Üzgünüm. Bundan vazgeçtim. Sonunda xml'ye benzeyen bir png yaptım. Ben hala bu kB :) – l33t

cevap

10

(yorumlayabilirler). Ancak, aynı adı (main_background.xml) ile proje xml dosyasında koyarak hile yapmak ve daha önce adlandırmak gerekir yeni dosya (main_background.png), görüntülemek için uygun bir şekilde doldurabilirsiniz. Tek ihtiyacınız sözdizimi burada descibed edilir:

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

, sizin durumunuzda bu yeterlidir (main_background.xml olarak olmayan kütüphane projesinde koymak ve main_background_new.png gibi yeni png var varsayarak) olabilir:

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

Yukarıdaki çözümle projenizden @drawable/main_background'a başvurabilirsiniz ve bir kitaplık yerine bir projeyle birlikte verilen dosyayı kullanmanız gerekir.

+1

Merhaba, evet bunu anlıyorum, cevabımda yayınladığım örneğe benzer, ancak API, resouce ID'lerini geçersiz kılma yeteneğine sahip olduğunuzu belirtir (uzantılara yorum yapmaz) Dürüst olmak gerekirse, bunun bir hata raporuna layık olduğunu düşünmeye başladım. – Sam

+0

Merhaba, yazımda bahsettiğim geçici çözüm için bir gelişme sağladığınız için size ihanet verdim. Ancak, uzantı ne olursa olsun resourceID'leri geçersiz kılabileceğinizi/kullanabileceğime eminim, bu yüzden zaman aldığımda bir hata raporu göndereceğim diye düşünüyorum. – Sam

+0

Teşekkürler, ama bunun mümkün olacağını sanmıyorum. - mevcut sistem, tüm kaynaklardan kütüphanelere ve projeye tek bir projeden geldiği gibi davranır ve aynı kaynak kimliği oluşturma algoritmasını kullanır - ilk önce bir projede aynı ada sahip ve farklı uzantıya sahip iki dosya eklenebilmelidir. –

3

Yani bir cevap olarak düşünmüyoruz bu soruna, bir 'çözüm' şudur:

söz konusu kütüphanede bir XML belgesi tanımlayın (biz onu bunny.xml arayacağım) ve görüntülenecek gerçek içerikle benzer bir adın (bunny_drawn.xml) başka bir xmline başvurunuz. olmadığımız öncelikle çünkü Ancak bu sorunu çözmez

bunny_image.png -

Sonra hedef projesinde, diğeriyle bunny.xml geçersiz kılıp, farklı bir isimle bir görüntü başvurmak için kullanabilirsiniz teknik olarak xml ile bir png'yi geçersiz kılmak (etki biraz da olsa). kaynakların ağır basan en önemli özelliklerinden biri de geçersiz kılınır olduğu İkincisi, çünkü yani onlar APK içine derlenmiş DEĞİLDİR:

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

Ama bunny_drawn.xml hala derlenmiş olacak! Sadece hedef APP'de değiştirilecek olan görüntüyü değil, aynı zamanda eski hedef bunny_drawn.xml dosyasını boş bir xml ile değiştirerek, ikinci noktanın üstesinden gelebiliriz. (ya da, Fenix'in işaret ettiği gibi, ilk durumda bunny_drawn.xml içeriğinin bunny.xml içeriğine sahip olabilirsiniz - aslında kaynak kimliğinin değiştirilemediği kalır.)

Sonum Sonuç, bunun Geliştirici Araçları'nda bir hata olarak sunulması gerektiğidir.

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. 

Farklı dosya uzantılarıyla bile aynı dosya adına sahip olabileceğinize inanmıyorum. Png'ye başka bir şey eklemeyi dene.

Şimdi, geçersiz kılma kullanmıyorum, Bu durumun varlığı nasıl geçersiz kılacağınızı beklediğinizden garip görünüyor. Ancak, lib'inizdeki iki öğenin de aynı olduğunu düşündüğünüzü düşünüyorum. Ve projenizde aynı ada sahip bir varlığa sahip olmanız iyi olabilir. Ancak, farklı türleri olması için tamam olduğunu kontrol ediyorum. XML, png'den farklıdır ve varlığa koddan erişirseniz, tür hataları alabilirsiniz.

Yukarıdaki noktayı açıklığa kavuşturmama izin verin. Bir kitaplık projesinin, uygulamanızdaki bir öğe ile aynı Kaynak Kimliğine sahip bir öğeye sahip olabileceğini anlıyorum. Ancak yukarıdaki hata, main_background.png ve main_background.xml öğelerinin her ikisinin de doğru olduğuna inandığım aynı projede ([com.mycom.mylib.myapp]) olduğunu düşündürmektedir.

Bu sayfa i izlenimini aldık ama bu sadece değil tekrar baktım Şimdi nerede http://developer.android.com/tools/projects/index.html

bilmiyorum kütüphane projesi de dahil olmak üzere projenin çeşitli türleri açıklanmıştır

Ek okumalar Aynı kaynak adını kullanarak bir kaynağı geçersiz kılabileceğiniz herhangi bir yeri belirtin. Tanrı, bunun neden bir özellik olduğunu düşündüğünü biliyor.

Yani hayır, aynı kural kaynakları aksi oluşturulan kaynak kimlikleri çakışarak, hatta kütüphane projelerinin genelinde eşsiz isimli gerektiğini, bildiğim kadarıyla Anladığım olarak geçerlidir. açıklanmıştır Ne

kaynak çakışmaları yönetilme biçimidir (hata senin almak).

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.

sistem her şeyi atmadan, en yüksek önceliğe sahip kaynak kullanacaktır. Garip, derleyicinin kaynağı atması gerektiği için bir derleme hatasının oluşmayacağını düşünmenizdir. Bu, orijinal posterin, aynı projesinde benzer şekilde adlandırılmış varlıklara sahip olduğunu ve lib ve proje genelinde değil, olduğuna inanmamı sağlıyor.

Bu aslında bir amaçlanan özellik olduğunu her yerde okumadım. Başka türlü söyleyecek bir bağlantın var mı? Sadece Android SDK farklı uzantılı bir dosya ile (o, sen değil gerçek dosyayı geçersiz kılma kaynak kimliği var) kaynak kimliği geçersiz kılamaz

+0

israf etmek zorunda üzülüyorum Bu alıntı ve teklifinde API teklifine göre bir 'özellik' veya en az bir kütüphane projeleri 'özellik' olması gerekiyordu. Aynı adla (uzantı dahil) kaynaklar için çalışacak, ancak bu bir resourceID değil - bir düzende atıfta bulunduğunuz bir şeydir. – Sam

+0

da, OP'nin aynı projede kaynakları olsa bile, kesinlikle yapmadım ve aynı problemi yaşadım. Bu nedenle, farklı kitaplıklarda aynı ada sahip (ancak farklı uzantı) kaynaklara sahip bir derleyici hatası alırsanız, bunun bir Geliştirici Araçları hatası olarak bildirilmesi gerektiğine katılıyor musunuz? – Sam

+0

Evet, ama aynı zamanda Kaynak kimliğinin bağlantılı/kurulum yollarından dolayı projeler arasında çatışmasıyla ilgili bir sorun olduğunu da biliyorum. Sorun şu ki, bununla ilgilenen SO gönderisini bulamıyorum. Bir sorun olarak kaldırın. – Emile

İlgili konular