我在Google上搜索过,但找不到任何相关结果。
我还检查了官方Android文档和this page(所有可用资源)是我能找到的。我在此页面上找到的相关链接(到 res/values/
目录)是:
这些页面没有说明 res/values/public.xml
文件的任何内容
以下是我为this type of file找到的示例。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="attr" name="commentTextColor" id="0xAA010007" />
<public type="drawable" name="add_icon_bl" id="0xAA020000" />
<public type="layout" name="act_date_picker" id="0xAA030001" />
<public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
<public type="xml" name="pref_menu" id="0xAA050000" />
<public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
<public type="array" name="taskRepeat" id="0xAA070000" />
<public type="color" name="theme_main_color_bl" id="0xAA080000" />
<public type="string" name="no_internet" id="0xAA0a0001" />
<public type="id" name="page1" id="0xAA0d0015" />
</resources>
从 type
属性中可以看出,它通常包含所有标准资源类型,通常放在单独的目录中< / strong>在 res
目录下...
为什么要滥用Android提供的目录并使用单个文件存储所有值?有人可以提供更多相关信息吗?
答案 0 :(得分:84)
文件 res / values / public.xml 用于为Android资源分配固定资源ID。
在 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>
Android资产包装工具(aapt)可能会在编译应用程序时为这些资源分配以下资源ID:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string3=0x7f040001;
}
}
现在,将字符串资源集更改为
<?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>
您会注意到@string/string3
的资源ID已更改:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string2=0x7f040001;
public static final int string3=0x7f040002; // New ID! Was 0x7f040001
}
}
为防止这种情况发生,您可以使用 res / values / public.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="string" name="string3" id="0x7f040001" />
</resources>
将导致资源ID分配如下:
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
}
}
应用程序很少用于 res / values / public.xml ,因为分配给资源的资源ID无关紧要。当它们发生变化时,无论如何都会重建整个应用程序,因此将更新Java资源ID对资源的任何引用。
res / values / public.xml 的最重要用户是Android平台本身。针对旧版Android构建的应用程序假定某些资源具有特定的资源ID。例如,Android资源@android:style/Theme
必须始终具有资源ID 0x01030005,以使平台向后兼容针对旧版本平台构建的应用程序。
如果您对有关如何分配资源ID的详细信息感到好奇,请参阅以下答案:How does the mapping between android resources and resources ID work?
答案 1 :(得分:8)
https://developer.android.com/studio/projects/android-library.html#PrivateResources
public.xml对于一般的库项目非常有用。如果您包含public.xml,则认为其余资源都是私有的。
虽然其他项目仍然可以使用私人资源,但是linter会警告使用它们,并且它们不会被包含在AndroidStudio的自动完成中。
这是自动生成public.xml的要点 https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303
答案 2 :(得分:3)
是否仅仅是为了使用OS代码的作者来定义符号名称和系统资源id之间的映射?
您可以在SDK中的YOUR_SDK_LOCATION \ 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" />
其中 - 所有系统resurce id,所以任何更改条目的人都会破坏他们的代码,因为它不会在标准设备上运行。