在styles.xml中使用的自定义属性参数

7

我有一组自定义的Android布局参数,它们在attrs.xml中定义。现在我想在styles.xml文件中使用一些标签。

目前我遇到了这个错误:

error: Error: No resource found that matches the given name: attr 'custom:tag'

我尝试声明自定义的XML命名空间,如下所示:

<resources
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.my.project"
>

希望可以在这里应用每个布局声明中使用的相同逻辑,但是没有成功。


请在styles.xml中发布代码。 - dira
<style name="my_style"> <item name="custom:tag">some_value</item> </style> - Sergey Metlov
3个回答

15

XML命名空间机制用于给标签和属性命名空间。当你像下面这样定义一个样式:

<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.my.project">

    <style name="my_style"> <item name="custom:tag">some_value</item> </style>

</resources>

你试图将XML命名空间应用于属性的值value,但不起作用。在这种情况下,你应该直接指定包名称,像这样:

    <style name="my_style"> <item name="com.my.project:tag">some_value</item> </style>

现在,Android将能够确定属性定义的位置。


好的,如果不同命名空间中存在相同名称的标签怎么办? - Sergey Metlov
那是个非常好的问题。经过进一步调查,我意识到我的之前的回答是不完整的,请参考更新后的答案。 - Martin Nordholts
根据我的理解,命名空间应该在布局xml中被引用?这仅适用于我的情况。 - Sergey Metlov
如果您在layout.xml中使用style属性引用包含有custom:tag的样式,那么您不需要在layout.xml中声明xmlns:custom。只有当您在layout.xml中使用来自custom命名空间的标签或属性时,才需要声明xmlns:custom在layout.xml中。(我希望我正确理解了您的问题,如果不是这样,请原谅我。) - Martin Nordholts
我指的是布局文件根标签中的XML命名空间引用。 - Sergey Metlov
@MartinNordholts 你怎么能说在属性值中使用命名空间不起作用呢?考虑以下代码: <style name="MyCustomTheme" ...> <item name="(!!!)android:windowBackground">@color/my_custom_color</item> - lorenzop

2

对我来说,已接受的解决方案并没有起作用,但它为情况提供了一些启示。

自定义属性可以在全局项目的包名称中解析和引用,例如“com.ltst.project”。即使您有多个模块(具有相同的基本包名称),资源也将在项目的包名称中解析。

因此,对于我来说,只需在样式中省略任何自定义属性的前缀即可。

自定义属性:

<declare-styleable name="SampleView">
    <attr name="sample_color" format="reference" />
</declare-styleable>

样式:

<style name="SampleStyle">
    <item name="sample_color">@color/sample_color</item>
</style>

0
你可以使用以下链接:

xmlns:app="http://schemas.android.com/apk/res-auto"

并为每个标签定义 app 前缀。

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