Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time
问题描述
在Android应用开发过程中,经常需要自定义控件,并且定义控件的属性,方便灵活的修改控件的显示样式,提高代码的可重用性和拓展性。但是在attrs.xml
文件定义控件的属性,编译工程时报错了。
Found item Attr/axis_x_min more than one time
当 attrs.xml
文件中有多个同名条目时,通常会出现Found item Attr/****** more than one time
错误消息。 attrs.xml
中的每个属性名称必须是唯一的。其实就是你的attrs.xml
中有同名的属性(比如line_number
)。
xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ChartView1">
<attr name="axis_left_min" format="float"/>
<attr name="axis_left_max" format="float"/>
<attr name="axis_right_min" format="float"/>
<attr name="axis_right_max" format="float"/>
<attr name="line_number" format="integer"/>
</declare-styleable>
<declare-styleable name="ChartView2">
<attr name="axis_x_min" format="float"/>
<attr name="axis_x_max" format="float"/>
<attr name="axis_y_min" format="float"/>
<attr name="axis_y_max" format="float"/>
<attr name="line_number" format="integer"/>
</declare-styleable>
</resources>
解决办法
方式一
修改同名的属性,使不同控件的属性名不一样。将ChartView1
控件的line_number
属性改名为line_number_chart1
,ChartView2
控件的line_number
属性改名为line_number_chart2
,这样就保证了属性名的唯一。
xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ChartView1">
<attr name="axis_left_min" format="float"/>
<attr name="axis_left_max" format="float"/>
<attr name="axis_right_min" format="float"/>
<attr name="axis_right_max" format="float"/>
<attr name="line_number_chart1" format="integer"/>
</declare-styleable>
<declare-styleable name="ChartView2">
<attr name="axis_x_min" format="float"/>
<attr name="axis_x_max" format="float"/>
<attr name="axis_y_min" format="float"/>
<attr name="axis_y_max" format="float"/>
<attr name="line_number_chart_2" format="integer"/>
</declare-styleable>
</resources>
方式二
将相同的属性定义到declare-styleable
标签外面,内部只声明引用,这样不同控件就可以重复使用了。
xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="line_number" format="integer"/>
<declare-styleable name="ChartView1">
<attr name="axis_left_min" format="float"/>
<attr name="axis_left_max" format="float"/>
<attr name="axis_right_min" format="float"/>
<attr name="axis_right_max" format="float"/>
<attr name="line_number" />
</declare-styleable>
<declare-styleable name="ChartView2">
<attr name="axis_x_min" format="float"/>
<attr name="axis_x_max" format="float"/>
<attr name="axis_y_min" format="float"/>
<attr name="axis_y_max" format="float"/>
<attr name="line_number" />
</declare-styleable>
</resources>
小结
通过上述两种方式,我们都可以解决Found item Attr/****** more than one time
的问题,相对而言,更推荐方式二的解决办法。方式二可以提高同名属性的重复性和利用率。