xml命名空间声明:自动替换包名

Posted

技术标签:

【中文标题】xml命名空间声明:自动替换包名【英文标题】:Xml namespace declaration: auto-substitute package name 【发布时间】:2012-05-13 22:47:18 【问题描述】:

我有一个包含多个构建目标的 android 项目(使用 ant)。出于测试目的,这些构建目标都有不同的包名称(所以我的包名称是 com.mycompany.myapp 用于发布构建,com.mycompany.myapp.test 用于测试构建)。

这在大多数情况下都很好用,除了布局文件中的自定义 xml 命名空间。 所以这个:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.mycompany.myapp" />

一旦包名被替换为 com.mycompany.myapp.test 就会停止工作。 因此,我必须在预建期间每次都替换 com.mycompany.myapp 值。而且由于所有这些文件都应该在 vcs 中,并且每次一个人切换配置并且它们合并时都不应该发生冲突,我不得不将布局文件移动到特定的配置文件夹中,它们看起来像这样:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/@CONFIG.PACKAGENAME@" />

现在这些文件存储在 vcs 中,并在预构建期间替换 @CONFIG.PACKAGENAME@,然后将文件从 ./config/file.xml 复制到 ./res/layout/file.xml。

这非常不方便,并且不能很好地扩展(我无法想象在构建脚本中提到 50 个文件中的每一个)。

所以我的问题是:有没有办法在命名空间声明中自动使用当前包名?或者至少修改布局文件(或构建文件?),这样我每次更改包名称时都不必替换 com.mycompany.myapp。

【问题讨论】:

【参考方案1】:

原来有一个后缀:res-auto。

所以你需要做的就是写

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto" />

这将自动使用当前包名。

【讨论】:

参考:developer.android.com/tools/sdk/eclipse-adt.html(ADT 17.0.0 节)。 "添加了对库中具有自定义属性的自定义视图的支持。使用自定义属性的布局必须使用命名空间 URI schemas.android.com/apk/res-auto 而不是包含应用程序包名称的 URI。此 URI 将替换为应用程序在构建时指定一个。” 即使我的项目使用包含自定义视图的库,它也能正常工作吗? Android Studio 和 Gradle 包含在 Alexey 的“what not”中。工作。 确认它也适用于 IntelliJ。为什么 Android 文档在教程中没有具体说明它是什么是一个谜 - 这是我在这里买的。

以上是关于xml命名空间声明:自动替换包名的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 替换命名空间中的元素?

默认情况下声明了哪些 XML 命名空间?

读取 XML 和未声明的命名空间

当根节点有命名空间声明时,GXT 和 AutoBeans 能否处理 XML?

JAXB 编组:更改应声明命名空间的元素

基于多部分 xml 根声明创建具有命名空间前缀的元素