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

Mat*_*ger 23 android styles

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

<org.taptwo.android.widget.TitleFlowIndicator
    ...
    app:footerTriangleHeight="0dip"
    ... />
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

ina*_*ruk 39

Android应用程序

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

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

例:

attrs.xml中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="testAttr" format="string"/>        
</resources>
Run Code Online (Sandbox Code Playgroud)

styles.xml中:

<?xml version="1.0" encoding="utf-8"?>
<resources>        
    <style name="TestStyle" >
      <item name="testAttr">asdf</item>
    </style>        
</resources>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest虽然您无法明确指定此命名空间,但解析器会自动默认为当前应用程序的命名空间.

  • 你是对的,我只需要删除样式文件中的命名空间,它就可以了.但奇怪的是,它在普通布局文件中需要,而不是在资源文件中.谢谢. (2认同)

Kur*_*rru 6

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

<style name="whatever">
    <item name="YourPackage.YourSubPackage:parametername">@drawable_or_anything/bla</item>
</style>
Run Code Online (Sandbox Code Playgroud)