Android库项目使用declare-styleable - 如何编译?

时间:2011-06-24 17:48:52

标签: android declare-styleable

我有一个自定义首选项控件,我在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引用有任何想法吗?

宣称风格只是Android团队在考虑图书馆时的疏忽吗?

6 个答案:

答案 0 :(得分:9)

我实际上玩了很多风格和图书馆并且有以下观察结果:

想象一下,你有一个拥有主项目和包含库的项目:

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,但最后并不需要它 - 这足以确保你的库中的xmls布局使用某种私有名称空间。
  • 现在是最有趣的部分 - 如何在项目的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"(!) 它确实看起来像是一个从安卓团队的忽视,但一旦你知道它,它完美无瑕。

答案 1 :(得分:6)

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

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

  

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

(我在上面引用的文字中修正了一个拼写错误/ res /子文件夹)

答案 2 :(得分:5)

这是Android中的known issue。预计在开发工具的下一个版本(r13)中将进行修复。

答案 3 :(得分: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>

我有这个想法here

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

的xmlns:AB =&#34; HTTP://schemas.android.com/apk/res-auto"