Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
res/values/public.xml文件在Android上有什么用途?_Android_Android Resources - Fatal编程技术网

res/values/public.xml文件在Android上有什么用途?

res/values/public.xml文件在Android上有什么用途?,android,android-resources,Android,Android Resources,我在谷歌上搜索过,但找不到任何相关的结果 我还查看了Android官方文档(所有可用资源),我只能找到这些文档。我在本页找到的相关链接(指向res/values/目录)如下: 这些页面没有告诉任何关于res/values/public.xml文件的信息。 下面是我为您找到的一个示例 小片段 从

我在谷歌上搜索过,但找不到任何相关的结果

我还查看了Android官方文档(所有可用资源),我只能找到这些文档。我在本页找到的相关链接(指向
res/values/
目录)如下:

这些页面没有告诉任何关于res/values/public.xml文件的信息。
下面是我为您找到的一个示例

小片段

属性中可以看到,它几乎包含了所有标准资源类型,您通常将它们放在
目录下的独立目录中



为什么要误用Android提供的目录并使用单个文件存储所有值?有人能提供更多信息吗?

这不是一个仅供操作系统代码作者使用的文件,用于定义符号名称和系统资源ID之间的映射吗

您可以在SDK中的位置\u SDK\u platforms\android-??\data\res\values找到它

它正在前进

此文件定义平台导出的基础公共资源, 它必须永远存在

还有一个警告:

修改此文件的任何人的重要注意事项请先阅读此文件 有什么变化吗

此文件定义了资源的二进制兼容性。像这样的 在这里进行更改时必须非常小心,否则您将 完全打破与旧应用程序的向后兼容性

它包含以下条目:

<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />


在it中,所有系统都会重新生成ID,因此任何更改条目的人都会破坏他们的代码,因为它不会在标准设备上运行。

文件res/values/public.xml用于将固定资源ID分配给Android资源

在res/values/strings.xml中考虑这些字符串资源集:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>
现在,将字符串资源集更改为

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string2">String 2</string>
    <string name="string3">String 3</string>
</resources>
要防止出现这种情况,可以使用res/values/public.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>
应用程序很少使用res/values/public.xml,因为分配给资源的资源ID并不重要。当它们发生更改时,整个应用程序都将重新构建,因此Java代码中按资源ID对资源的任何引用都将被更新

res/values/public.xml最重要的用户是Android平台本身。基于旧版本Android构建的应用程序假定某些资源具有特定的资源ID。例如,Android资源必须始终具有资源ID 0x01030005,平台才能与基于旧版本平台构建的应用程序向后兼容

如果您想了解有关如何分配资源ID的更多详细信息,请参考以下答案:

通常,public.xml对于图书馆项目很有用。如果包含public.xml,则假定其余资源是私有的

尽管私有资源仍然可以被其他项目使用,linter将警告使用它们,并且它们不会包含在AndroidStudio的自动完成中

下面是自动生成public.xml的要点

我不知道该文件是Android SDK的一部分。。。无论如何,我发现的示例并没有改变现有的值,它只是创建了其他的自定义值。。。所以我不认为你发布的限制适用于这种情况。我想它一定是为了那些想开发定制操作系统ROM的人。如果您添加了一个新的系统资源名称/id,那么您可以编译应用程序代码和ROM代码来使用它。但是,该应用程序只能在您的自定义ROM手机上运行。不,我在普通应用程序中发现了该应用程序,而不是在自定义ROM中发现的。是否可以在我自己的项目中定义公共资源ID,我尝试过,但失败了@igorpovit可以在自己的项目中使用public.xml来修复资源ID,直到2015年。2015年,谷歌(一如既往)在gradle破坏了这一功能,并拒绝修复。以下是相应问题的链接:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>
public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040002;
        public static final int string3=0x7f040001; // Resource ID from public.xml
    }
}