用于定制视图的attrs.xml中的同名属性

我正在写几个自定义视图,它们共享一些相同名称的属性。 在<declare-styleable>的各自的<declare-styleable>部分,我想使用相同的名字来表示属性:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyView1"> <attr name="myattr1" format="string" /> <attr name="myattr2" format="dimension" /> ... </declare-styleable> <declare-styleable name="MyView2"> <attr name="myattr1" format="string" /> <attr name="myattr2" format="dimension" /> ... </declare-styleable> </resources> 

我得到一个错误,说myattr1myattr2已经定义。 我发现我应该省略myattr2中的myattr1myattr2format属性,但如果我这样做,我在控制台中获得以下错误:

 [2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute 

有没有办法,我可以做到这一点,也许某种types的命名空间(只是猜测)?

解决scheme:只需从两个视图中提取常用属性,并直接将它们添加为<resources>节点的子节点:

 <?xml version="1.0" encoding="utf-8"?> <resources> <attr name="myattr1" format="string" /> <attr name="myattr2" format="dimension" /> <declare-styleable name="MyView1"> <attr name="myattr1" /> <attr name="myattr2" /> ... </declare-styleable> <declare-styleable name="MyView2"> <attr name="myattr1" /> <attr name="myattr2" /> ... </declare-styleable> </resources> 

我张贴这个答案作为上述贴出的解决scheme没有为我在android工作室。 我需要分享我的自定义视图之间的自定义属性,所以我在Android工作室尝试以上解决scheme,但没有运气。 所以我试着去做一个方法。 希望它可以帮助那些寻找同样问题的人。

  <?xml version="1.0" encoding="utf-8"?> <resources> <!-- parent styleable --> <declare-styleable name="MyView"> <attr name="myattr1" format="string" /> <attr name="myattr2" format="dimension" /> </declare-styleable> <!-- inheriting parent styleable --> <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"--> <declare-styleable name="MyView1" parent="MyView"> <attr name="myattr1" /> <attr name="myattr2" /> <attr name="myBackgroundColor" format="color"/> </declare-styleable> <!-- inheriting parent styleable --> <!-- same way here "myfonnt" belongs to child styelable "MyView2" --> <declare-styleable name="MyView2" parent="MyView"> <attr name="myattr1" /> <attr name="myattr2" /> <attr name="myfont" format="string"/> ... </declare-styleable> </resources> 

这完全适用于我。 我们需要做一个父风格,然后我们需要inheritance父风格。 例如,正如我已经做了上述:父风格的名字MyView,并inheritance了我的其他样式分别像MyView1和MyView2。

正如Priya Singhal所回答的那样,Android Studio需要在自己的样式名称中定义常用的属性名称。 他们不能再成为根。

然而,还有其他一些事情要注意(这就是为什么我也加了一个答案):

  • 常见的风格不需要与视图命名相同。 (感谢这个答案 ,指出了。)
  • 您不需要使用父项的inheritance。

这是我在最近有两个自定义视图的项目中所做的,它们共享相同的属性。 只要自定义视图仍然具有属性的名称,但不包含format ,我仍然可以从代码中正常访问它们。

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- common attributes to all custom text based views --> <declare-styleable name="TextAttributes"> <attr name="text" format="string"/> <attr name="textSize" format="dimension"/> <attr name="textColor" format="color"/> <attr name="gravity"> <flag name="top" value="48" /> <flag name="center" value="17" /> <flag name="bottom" value="80" /> </attr> </declare-styleable> <!-- custom text views --> <declare-styleable name="View1"> <attr name="text"/> <attr name="textSize"/> <attr name="textColor"/> <attr name="gravity"/> </declare-styleable> <declare-styleable name="View2"> <attr name="text"/> <attr name="textSize"/> <attr name="textColor"/> <attr name="gravity"/> </declare-styleable> </resources> 

简化的例子

实际上,我甚至不需要将这些属性放在一个自定义名称下。 只要我定义它们(给他们一个format )至less一个自定义视图,我可以在任何地方使用它们(没有format )。 所以这也适用(而且看起来更干净):

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="View1"> <attr name="text" format="string"/> <attr name="textSize" format="dimension"/> <attr name="textColor" format="color"/> <attr name="gravity"> <flag name="top" value="48" /> <flag name="center" value="17" /> <flag name="bottom" value="80" /> </attr> </declare-styleable> <declare-styleable name="View2"> <attr name="text"/> <attr name="textSize"/> <attr name="textColor"/> <attr name="gravity"/> </declare-styleable> </resources> 

谢谢刘易斯我有同样的问题,你的inheritance解决scheme给了我像下面这样做的提示,它工作正常。我只是在上面声明的公共属性,重写它的风格声明的主体再次没有格式化。 我希望它可以帮助别人

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- common attributes --> <attr name="myattr1" format="string" /> <attr name="myattr2" format="dimension" /> <!-- also note "myBackgroundColor" belongs to child styleable"MyView1"--> <declare-styleable name="MyView1" > <attr name="myattr1" /> <attr name="myattr2" /> <attr name="myBackgroundColor" format="color"/> </declare-styleable> <!-- same way here "myfonnt" belongs to child styelable "MyView2" --> <declare-styleable name="MyView2" parent="MyView"> <attr name="myattr1" /> <attr name="myattr2" /> <attr name="myfont" format="string"/> ... </declare-styleable> 

以防万一有人在尝试可用的解决scheme后仍然遇到这个问题。 我坚持使用string格式添加subtitle属性。

我的解决scheme是删除格式。

之前:

<attr name="subtitle" format="string"/>

后:

<attr name="subtitle"/>