14

我有一个自定义首选项控件,我在 values/attrs.xml 中定义了一些属性。只是为了集中讨论,这里有一个可以在 values/attrs.xml 中找到的属性示例:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyCustomView">
        <attr name="android:text"/>
        <attr name="android:textColor"/>            
        <attr name="extraInformation" format="string" />
    </declare-styleable>
</resources>

要使用属性,您可以在要使用它的地方使用 xmlns 标记,它看起来像这样:

xmlns:custom="http://schemas.android.com/apk/res/com.conundrum.app.lib"

这就是问题所在:xmlns 定义引用了 LIBRARY 的包名,并且该资源在 LIBRARY 项目中编译得很好。但是,包含 Library 项目的 Android 项目具有不同的包名称,Android 会尝试合并所有资源。当它到达这个 xmlns 定义时,它会因为包含 Android 项目中的包名称不同而犹豫不决。

有人对在包含 Android 项目中仍然有效的库项目中使用 xmlns 引用有任何想法吗?

当他们考虑库时,declare-styleables 只是 Android 团队的疏忽吗?

4

6 回答 6

9

实际上,我在 styleable 和 library 上玩了很多,并且有以下观察结果:

假设您有一个包含主项目和包含库的项目:

main
   |--- library
  • 即使库包含样式,使用包含的库编译应用程序也没有问题。例如,您可以包含我的一个库 ( http://code.google.com/p/tree-view-list-android/ )。您会在那里找到许多可样式化的属性(如可折叠)和一些在库中使用它的 XML。无论您单独编译库还是作为包含库,所有编译和工作都很好......所以这里看起来不错......
  • 现在,当您在库和主项目中都有同名的资源时,您可能会在编译主项目时遇到奇怪的问题。起初我不理解它,但现在我知道它是如何工作的。例如,如果您的库 main.xml 中有 android:id="@+id/some_id",然后在您的主项目中有另一个 main.xml(没有 some_id id),那么 R.id.some_id 将编译库时会生成,但不会在主项目中生成 - 这可能会导致主项目的编译错误,因为包含的库 .java 文件很可能会使用 R.id.some_id (将丢失)。我最初误解了这个问题并试图动态获取id,
  • 现在是最有趣的部分——如何在项目的 layout.xmls 中引用样式参数?正如您所注意到的,以下内容不起作用:xmlns:custom="http://schemas.android.com/apk/res/YOUR_LIBRARY_PACKAGE" 令人惊讶的是xmlns:custom="http://schemas.android.com/apk/res/YOUR_MAIN_APP_PACKAGE"(!)它确实看起来像是 android 团队的一个忽略,但是一旦您知道它,它就可以完美地工作。
于 2011-06-27T22:09:17.253 回答
6

采用http://schemas.android.com/apk/res-auto

我发现这个解决方案是在AndroidSVG项目中作为旁注随便给出的:

另外:注意命名空间中的特殊架构 URL。如果您在自己的项目中使用自定义视图,您将使用基于您的包名称的 URL。例如http://schemas.android.com/apk/res/com.example.customview。但是由于自定义视图在包含的库中,您应该使用 res-auto 快捷方式。构建您的应用程序时,将自动插入真实的架构 URL。

(我修正了一个错字 - 缺少 /res/ 子文件夹 - 在上面引用的文本中)

于 2013-11-04T17:31:41.670 回答
5

这是 Android 中的一个已知问题。预计在开发工具的下一个版本 (r13) 中会进行修复。

于 2011-07-27T21:27:28.010 回答
3

我也有同样的问题。我的应用程序未检测到库项目可样式化 xml。

我试过这个:

我的图书馆项目包:com.lib.mylibrary 我的应用程序项目包:com.app.myapp

我试过xmlns:custom="http://schemas.android.com/apk/res/com.app.myapp

代替xmlns:custom="http://schemas.android.com/apk/res/com.lib.mylib

它工作得很好,即。尝试

xmlns:custom="http://schemas.android.com/apk/res/<your app package>

代替

xmlns:custom="http://schemas.android.com/apk/res/<your lib project package>

我在这里得到了这个想法

于 2012-03-15T12:43:10.997 回答
1

也许有点晚了,但该问题似乎已在开发工具的最新 (r14) 版本中得到修复。

于 2011-10-19T14:57:42.723 回答
0

这为我修好了。我还记得 Xamarin 有这个问题,同样的解决方案也适用于 Xamarin。

xmlns:ab="http://schemas.android.com/apk/res-auto"

于 2015-08-05T23:59:36.790 回答