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

jks*_*der 14 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>
Run Code Online (Sandbox Code Playgroud)

要使用这些属性,可以使用要在其中使用的xmlns标记,它看起来像这样:

xmlns:custom="http://schemas.android.com/apk/res/com.conundrum.app.lib"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jar*_*iuk 9

我实际上玩了很多样式和库,并有以下观察:

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

main
   |--- library
Run Code Online (Sandbox Code Playgroud)
  • 即使库包含样式,使用包含库编译应用程序也没有问题.例如,您可以包含我的一个库(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"它确实起作用(!)它确实看起来像是安卓团队的一个忽视,但一旦你知道它,它就完美无瑕.


Abi*_*aba 6

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

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

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

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


Gra*_*and 5

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