是否可以在android资源中的样式中添加自定义属性?

时间:2011-08-29 12:54:28

标签: android styles

我在我的项目中使用了一个视图流组件,它允许dev覆盖一些属性,如:

<org.taptwo.android.widget.TitleFlowIndicator
    ...
    app:footerTriangleHeight="0dip"
    ... />

我正在将这个组件重用到几个布局中,我想将这些属性放入样式中。 但是当我这样做时,解析器会说Error: No resource found that matches the given name: attr 'app:footerTriangleHeight',即使我在样式文件中添加了命名空间。

有没有办法在android中做到这一点?

感谢。

2 个答案:

答案 0 :(得分:39)

Android应用

如果您没有使用Android库,那么您可以执行以下操作:

  1. 定义自定义样式属性(我猜你已经完成了)。
  2. 不要在样式项中使用名称空间前缀(名称空间默认为当前应用程序的名称空间)。
  3. 示例:

    attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="testAttr" format="string"/>        
    </resources>
    

    styles.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>        
        <style name="TestStyle" >
          <item name="testAttr">asdf</item>
        </style>        
    </resources>
    

    Android库

    如果自定义属性来自Android库,您仍然可以使用所描述的方法。它理论上应该可行,因为Android Library的命名空间与应用程序的命名空间相同(在构建期间从aapt工具角度来看)。但我自己没有测试过。


    如果您要指定命名空间,则会显示错误。据我所知,样式不支持xml名称空间。所以这会失败:

    styles.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:app="http://schemas.android.com/apk/res/app.package.name">        
        <style name="TestStyle" >
          <item name="app:testAttr">asdf</item>
        </style>        
    </resources>
    

    Parser自动默认为当前应用程序的AndroidManifest命名空间,但您无法明确指定此命名空间。

答案 1 :(得分:6)

您可以根据命名空间定义样式,我自己使用

<style name="whatever">
    <item name="YourPackage.YourSubPackage:parametername">@drawable_or_anything/bla</item>
</style>