如何为不同的标签声明几个具有相同名称的可设置属性?

时间:2013-09-16 12:19:35

标签: java android xml declare-styleable styleable

我希望我的ViewA和ViewB都有“标题”标签。但我不能把它放在attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ViewA">
        <attr name="title" format="string" />
    </declare-styleable>
    <declare-styleable name="ViewB">
        <attr name="title" format="string" />
        <attr name="max" format="integer" />
    </declare-styleable>
</resources>

由于错误属性“title”已经定义Another question显示了此解决方案:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="title" format="string" />
    <declare-styleable name="ViewB">
        <attr name="max" format="integer" />
    </declare-styleable>
</resources>

但在这种情况下,不会生成R.styleable.ViewA_titleR.styleable.ViewB_title。我需要它们使用以下代码从AttributeSet中读取属性:

TypedArray a=getContext().obtainStyledAttributes( as, R.styleable.ViewA);
String title = a.getString(R.styleable.ViewA_title);

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:32)

您发布的链接确实为您提供了正确的答案。这就是你的建议:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="title" format="string" />
    <declare-styleable name="ViewA">
        <attr name="title" />
    </declare-styleable>
    <declare-styleable name="ViewB">
        <attr name="title" />
        <attr name="max" format="integer" />
    </declare-styleable>
</resources>

现在,R.styleable.ViewA_titleR.styleable.ViewB_title都可以访问。

如果有机会,请仔细阅读以下答案:Link。相关报价:

  

您可以在顶部元素或内部定义属性   一个元素。如果我打算更多地使用attr   我把它放在根元素中的一个地方。

答案 1 :(得分:4)

您需要使用继承

<resources>
    <declare-styleable name="ViewA">
        <attr name="title" format="string" />
    </declare-styleable>

    <declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA
        <attr name="min" format="integer" />
        <attr name="max" format="integer" />
    </declare-styleable>
</resources>

在你的java代码中

String namespace = "http://schemas.android.com/apk/res/" + getContext().getPackageName();
int title_resource = attrs.getAttributeResourceValue(namespace, "title", 0); 
String title = "";
if(title_resource!=0){
  title = getContext().getString(title_resource);
}

int min = attrs.getAttributeResourceValue(namespace, "min", 0); // read int value
int max = attrs.getAttributeResourceValue(namespace, "max", 0);

答案 2 :(得分:4)

这样做。无需Angular 1代码

parent

这是因为在<resources> <declare-styleable name="ViewA"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ViewB" > <attr name="title" /> <attr name="min" format="integer" /> <attr name="max" format="integer" /> </declare-styleable> </resources> 中宣布title后,它不再需要(并且也不能)在另一个ViewA中再次声明<\ n} / p>

答案 3 :(得分:2)

<resources>
<declare-styleable name="ViewA">
    <attr name="title" format="string" />
</declare-styleable>

<declare-styleable name="ViewB" parent="ViewA"> // inherit from ViewA
    <attr name="min" format="integer" />
    <attr name="max" format="integer" />
</declare-styleable>

这不起作用。

<resources>
<attr name="title" format="string" />
<declare-styleable name="ViewA">
    <attr name="title" />
</declare-styleable>
<declare-styleable name="ViewB">
    <attr name="title" />
    <attr name="max" format="integer" />
</declare-styleable>

这也行不通。

<resources>
<declare-styleable name="ViewA">
    <attr name="title" format="string" />
</declare-styleable>

<declare-styleable name="ViewB" >
    <attr name="title" /> 
    <attr name="min" format="integer" />
    <attr name="max" format="integer" />
</declare-styleable>

这没关系!!