我有两个 Android 项目,一个主项目(包名com.adip.sampler
)和一个添加到主项目(包名)的库com.samples.projb
。在他们两个资源中,我都有一个integer-array
相同的键my_int_values
::
在主要项目中:
<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 上检查。