gpt4 book ai didi

Android资源键冲突

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:53 25 4
gpt4 key购买 nike

我有两个 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>

在 Activity 的主项目中,如果我正在调查这些数组(主项目和库)的值是什么:

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 工具生成了相同的值,所以难怪我会遇到这种情况。如果我从一个整数数组中更改键,我可以摆脱这种行为,但想象一下你有一些拥有大量资源、依赖库的大项目,迟早你可能会遇到这种问题:有具有相同键值的相同类型的资源(我已经检查过 stringstring-array 并且上面的行为也出现在那里)。所以问题是:

  1. 为什么会出现这个问题?或者,如果这不是问题,如何解释这种行为?
  2. 如何最好地避免它?我猜想在定义键时尝试具有某种唯一性可以解决问题,但开发人员往往很懒惰......

这似乎使用了最新 ADT 和 Eclipse 版本(Juno 和 Indigo)的多个变体。仅在 Windows 上检查。

最佳答案

Library Projects at Android Developers 读取, 有很多引用资料,他们清楚地说合并发生在构建时,并且具有相同 ID 的资源会相互覆盖。

对于库和应用程序中具有相同 ID 的资源

In cases where a resource ID is defined in both the application and the library, 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. This gives your application the flexibility to either use or redefine any resource behaviors or values that are defined in any library.

对于来自两个库的具有相同ID的资源

... your application can add references to multiple library projects, then specify the relative priority of the resources in each library. This lets you build up the resources actually used in your application in a cumulative manner. When two libraries referenced from an application define the same resource ID, the tools select the resource from the library with higher priority and discard the other.

文档中建议的解决方案

Use prefixes to avoid resource conflicts

To avoid resource conflicts for common resource IDs, consider using a prefix or other consistent naming scheme that is unique to the project (or is unique across all projects).

如何在库中设置优先级 command line

If you are adding references to multiple libraries, note that you can set their relative priority (and merge order) by manually editing the project.properties file and adjusting the each reference's .n index as appropriate.

关于Android资源键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com