我有兩個Android項目,一個是主要項目(包名稱com.adip.sampler
)和一個添加到主項目(包名稱com.samples.projb
)的庫。在資源兩者我有相同密鑰的integer-array
:my_int_values
:Android資源關鍵衝突
在主要項目:
<integer-array name="my_int_values">
<item>10</item>
<item>20</item>
<item>30</item>
<item>40</item>
<item>50</item>
<item>60</item>
<item>70</item>
<item>80</item>
</integer-array>
而在庫:
<integer-array name="my_int_values">
<item>34</item>
<item>35</item>
<item>36</item>
<item>37</item>
</integer-array>
在主體工程從活動如果我正在調查這些陣列(主項目和庫)的值是什麼:
protected void showLocalStrings() {
Log.d("RESSampler", "In Main: " + Arrays.toString(getResources().getIntArray(com.adip.sampler.R.array.my_int_values)));
Log.d("RESSampler", "In Libr: " + Arrays.toString(getResources().getIntArray(com.samples.projb.R.array.my_int_values)));
}
然後我在logcat中看到的是:
In Main: [10, 20, 30, 40, 50, 60, 70, 80]
In Libr: [10, 20, 30, 40, 50, 60, 70, 80]
看來,主體工程覆蓋在文庫陣列中定義的值...如果我從正確的密鑰和資源閱讀我翻了一番檢查沒問題。直到我看了每個生成的R
類。在主要的項目,這是我對com.adip.sampler.R.array.my_int_values
:
public static final class array {
public static final int my_int_values=0x7f060000;
}
而在庫項目com.samples.projb.R.array.my_int_values
:
public static final class array {
public static final int my_int_values = 0x7f060000;
}
的Android工具生成相同的值,所以難怪我得到這個行爲。如果我從其中一個整數數組中更改密鑰,我可以擺脫這種行爲,但想象一下,您有一些擁有大量資源和依賴庫的大型項目,遲早會碰到這種問題:擁有具有相同鍵值的相同類型的資源(我已使用string
和string-array
進行了檢查,並且以上行爲也出現在此處)。所以問題是:
- 爲什麼會出現此問題?或者,如果這不是什麼問題解釋這種行爲?
- 如何避免它最好?我猜測,在定義密鑰方面嘗試具有某種獨特性會起到訣竅,但開發人員傾向於懶惰...
這出現使用多種最新的ADT和Eclipse版本(Juno和Indigo )。僅在Windows上進行檢查。
我害怕這是答案:)你碰巧知道Lint是否有意義檢測跨不同項目的重複資源ID? – gunar
對此的評論「這給你的應用程序提供了靈活性,可以使用或重新定義在任何庫中定義的任何資源行爲或值,我真的沒有在這裏看到任何靈活性。如果Android使用主項目或優先級較高的項目中的資源並轉儲重複資源,那麼靈活性在哪裏? – gunar
接受的答案,但StackOverflow允許我只在22小時內給予賞金。大頭針! – gunar