我不确定我是否在这里遇到了Android工具的错误,或者这是否是设计的。问题是这样的:我有一个导出小部件的Android库项目。作为该小部件的一部分,styleable属性在R.styleable:
中导出。库项目(package = com.example.mylib):
<declare-styleable name="com.example.MyWidget">
<attr name="someAttr" format="integer" />
</declare-styleable>
App项目(package = com.example.myapp):
<LinearLayout xmnls:mylib="http://schemas.android.com/apk/res/com.example.mylib">
<com.example.MyWidget android:id="..." mylib:someAttr="1" />
</LinearLayout>
问题是,someAttr
属性似乎只有在库和应用程序使用相同的包标识符时才对Android/ADT可见!在这种情况下,它们没有,并且ADT失败并出现以下错误:
在包'com.example.mylib'中找不到属性'someAttr'的资源标识符
就像我说的,我可以通过将应用程序的包名更改为"com.example"来解决这个问题。mylib",但这当然不是我想要的!我错过什么了吗?
这是一个已知的bug #9656。关于这个问题,我已经写了两篇文章:这里和这里。我已经解释了为什么会发生这种情况,以及如果您真的需要立即修复这个问题,如何修补这个问题。
现在,如果您不想重新构建aapt,则需要将所有自定义属性和使用这些自定义属性的布局从库移动到应用程序。
对于任何可能仍在寻找答案的人:自ADT 17以来,您必须使用http://schemas.android.com/apk/res-auto作为库项目中自定义属性的命名空间,这是一个魅力:
xmnls:mylib="http://schemas.android.com/apk/res-auto"