在安卓资源中,是否可以将自定义属性添加到样式中?

24
我在我的项目中使用了一个视图流组件,允许开发者覆盖一些属性,比如:

<org.taptwo.android.widget.TitleFlowIndicator
    ...
    app:footerTriangleHeight="0dip"
    ... />
我将此组件重用于多个布局,并希望将属性放入样式中。但是当我这样做时,解析器会显示错误:Error: No resource found that matches the given name: attr 'app:footerTriangleHeight',即使我在样式文件中添加了命名空间也是如此。
有没有一种在Android中实现这一点的方法?
谢谢。

所选答案是错误/不完整的。您可以在样式文件中为自定义 UI 元素设置样式,我已经自己做过了...请参考我的答案。 - Kurru
请查看此处的内容,它将解决您的问题。 - aolphn
我在 Stack Overflow 上找到了相同的问题,并解决了我的问题,这里 - aolphn
我在这里找到了相同的问题:https://dev59.com/qGw15IYBdhLWcg3wD3Zk - aolphn
2个回答

40

Android 应用

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

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

例如:

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库的命名空间与应用程序的相同(从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>

解析器自动默认为当前应用程序的AndroidManifest命名空间,尽管您不能明确指定此命名空间。

2
你是对的,我只需要在样式文件中删除命名空间,就可以正常工作了。但奇怪的是,这在普通布局文件中是必需的,而在资源文件中却不是。谢谢。 - Matthieu Oger
这适用于新的CardView小部件,例如:只需删除命名空间,然后像<item name="contentPadding">16dp</item>这样的样式项就可以编译和运行。 - personne3000

6
您可以根据您的命名空间定义样式,我自己也使用过它。
例如:
<style name="whatever">
    <item name="YourPackage.YourSubPackage:parametername">@drawable_or_anything/bla</item>
</style>

在冒号之前的文本中,请使用您清单中定义的命名空间作为您的“包”。 - Kurru
1
这对我来说不起作用。我的自定义样式属性是一个枚举。 - David Snabel-Caunt
你尝试过将枚举和属性完全量化吗? - Kurru
它可以用来引用库视图的属性吗? - Leonardo Raele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接