Xml名称空间声明:自动替换包名称

Ale*_*xey 47 xml ant android android-layout

我有一个带有多个构建目标的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" />
Run Code Online (Sandbox Code Playgroud)

只要用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@" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*xey 118

事实证明,有一个后缀:res-auto.

所以你需要做的就是写作

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto" />
Run Code Online (Sandbox Code Playgroud)

这将自动使用当前包名称.

  • 即使我的项目使用包含自定义视图的库,它也能工作吗? (2认同)