2012-04-07 5 views
19

Android 용 라이브러리 MyLib (Android 2.2를 타겟팅)에 필요한 앱이 모두 포함되어 있습니다. 내 응용 프로그램 MyApp 프로젝트에서응용 프로그램에서 라이브러리의 xml 리소스를 png 리소스로 재정의 할 수 없습니까?

drawable/main_background.xml 

내가 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

죄송합니다. 나는 이것을 포기했다. 마침내 내 xml처럼 보인 png를 만들었습니다. 나는 그 kB를 낭비해야만한다는 것을 여전히 화나게하고있다. :) – l33t

답변

10

Android SDK에서 다른 확장명을 가진 파일로 리소스 ID (실제 파일이 아닌 덮어 쓰는 리소스 ID)를 재정의 할 수 없습니다. 그러나 프로젝트 이름이 같은 XML 파일 (main_background.xml)을 입력하고 새 파일 (main_background.png)을 표시하는 적절한 방법으로 입력하여 이름을 바꿔야합니다. 당신이 필요로하는 모든 구문은 여기 통해 VII된다

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

안녕하세요, 네, 내 대답에 게시 된 예제와 유사하지만, 이해가 API가 당신 resouce ID를 재정의 할 수있는 상태 (그것은 확장에 대한 언급하지 않습니다) , 솔직히 말해서, 이것이 버그 리포트에 합당하다고 생각하기 시작했습니다. – Sam

+0

안녕하세요, 필자가 내 게시물에서 언급 한 대안에 대한 개선점을 제공하면서 당신에게 현상금을 수여했습니다. 그러나, 나는 꽤 확신하고있어/확장/관계없이 resourceIDs 재정의 할 수 있도록 시간이되면 버그 보고서를 제출하는 것 같아요. – Sam

+0

고마워,하지만 난 생각하지 않는다 - 현재 시스템은 라이브러리 및 프로젝트의 모든 리소스를 하나의 프로젝트에서 가져온 것과 동일하게 취급하고 동일한 리소스 ID 생성 알고리즘을 사용합니다. 동일한 이름과 확장명을 가진 두 개의 파일을 하나의 프로젝트에 먼저 포함시켜야합니다. –

3

그래서 내가 대답이라고 생각하지 않습니다이 문제에 대한 하나의 '솔루션'은 다음과 같다 :

문제의 라이브러리에 XML 문서를 정의 (우리가 그것을 bunny.xml 전화 할게) , 표시 될 실제 내용이있는 유사한 이름의 다른 xml (bunny_drawn.xml)을 참조하게하십시오. 우리는 때로 믿을 먼저하기 때문에,이 그러나 문제가 해결되지

을 bunny_image.png -

그런 다음, 대상 프로젝트에서, 서로 bunny.xml 무시하고 대신 다른 이름으로 이미지를 참조하는 데 사용할 기술적으로 xml을 가진 png를 오버라이드하지 않습니다 (효과는 다소 비슷합니다). 자원을 재정의 주요 기능 중 하나가 그들이 오버라이드 (override)되어있다 둘째 때문에, 즉 그들은 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 여전히 컴파일 될 것입니다! 목표 APP에서 대체 될 이미지를 정의 할뿐만 아니라 이전 타겟 인 bunny_drawn.xml을 빈 xml로 대체함으로써 두 번째 점을 일 정치적으로 극복 할 수 있습니다. (또는 Fenix가 지적했듯이 첫 번째 경우에는 bunny.xml의 내용을 bunny.xml 안에 넣을 수 있습니다. 리소스 ID를 바꿀 수 없다는 사실은 여전히 ​​남아 있습니다 ...)

그래서 내 마지막 결론은 개발자 도구에서이 버그를 버그로 제출해야한다는 것입니다.

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. 

다른 확장자로도 동일한 파일 이름을 사용할 수 있다고 생각하지 않습니다. PNG의 다른 이름을 지정해보십시오.

이제 재정의를 사용하지 않았습니다. 따라서 자산을 재정의하는 방법이 될 것으로 예상되므로 이상하게 보입니다. 그러나 나는 당신이 같은 이름의 라이브러리에 두 자산을 가지고 있다고 생각합니다. 그리고 프로젝트에서 같은 이름의 애셋을 사용하는 것이 좋습니다. 그러나 나는 그것의 ok가 다른 타입을 가지고 있는지 점검 할 것입니다. XML은 png와 다르며 코드에서 애셋에 액세스하면 형식 오류가 발생할 수 있습니다.

위의 사항을 분명히 설명합니다. 라이브러리 프로젝트는 애플리케이션의 항목과 동일한 리소스 ID를 가진 항목을 가질 수 있음을 알고 있습니다.

그러나 위의 오류는 main_background.png와 main_background.xml이 동일한 프로젝트 ([com.mycom.mylib.myapp])에 있음을 보여줍니다. 그 프로젝트는 정확하지 않다고 생각합니다.

이 페이지는 내가에서 인상을 가지고 있지만, 간단하지 않습니다 다시보고 한 경우 이제 http://developer.android.com/tools/projects/index.html

내가 모르는 라이브러리 프로젝트를 포함하여 프로젝트의 다양한 유형에 대해 설명

추가 읽기 동일한 자원 이름을 사용하여 자원을 대체 할 수있는 모든 위치. 하나님은 내가 왜 그것이 특징이라고 생각하는지 안다.

그렇다면 라이브러리 프로젝트 간에도 고유 한 이름을 지정해야한다는 동일한 규칙이 적용됩니다. 그렇지 않으면 생성 된 리소스 ID가 충돌합니다. (귀하의 오류가 점점)

설명하는 방법은 리소스 충돌을 관리하는 방법입니다.

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

자문위원과 현상금 설명문에있는 API 견적에 따르면 라이브러리 프로젝트의 '기능'또는 적어도 '속성'이되어야한다. 동일한 이름 (확장자 포함)을 가진 리소스에서 작동하지만 리소스 ID가 아닙니다. 이는 레이아웃에서 참조하는 것입니다. – Sam

+0

또한 OP가 같은 프로젝트의 리소스를 가지고 있었을지라도 분명히 그렇지 않았고 같은 문제가있었습니다. 그래서 다른 라이브러리에서 같은 이름의 리소스 (확장자가 다른)로 컴파일러 오류가 발생하면 개발자 도구 버그로보고해야한다는 데 동의합니까? – Sam

+0

네,하지만 리소스 ID가 연결/설정 방식으로 인해 프로젝트간에 충돌하는 문제가 있다는 것을 알고 있습니다. 문제는 무엇인지, 나는 그것을 처리하는 SO 게시물을 찾을 수 없습니다. 그것을 문제로 제기하십시오. – Emile