CustomView を作っていると、独自の xml の属性を定義するためにattrs.xml
を作って、<declare-styleable>
でアトリビュートを定義する場面があります。
この時、同じ型で同じ名前の属性を、複数の CustomView にまたがって使い回したい場面で、以下のようにすると、エラーでビルドできません。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CompoundRelativeLayout">
<attr name="checked" format="boolean|reference"/>
</declare-styleable>
<declare-styleable name="CompoundFrameLayout">
<attr name="checked" format="boolean|reference"/>
</declare-styleable>
<declare-styleable name="CompoundGridLayout">
<attr name="checked" format="boolean|reference"/>
</declare-styleable>
<declare-styleable name="CompoundLinearLayout">
<attr name="checked" format="boolean|reference"/>
</declare-styleable>
</resources>
同じ名前・型の属性を複数宣言していることになるため、コンパイルに失敗します。
<attr>
タグは、<declare-styleable>
タグの子要素としてだけでなく、<resources>
タグの子要素としても配置することが出来、<resources>
タグの子要素としておくことで、複数の CustomView で共通な名前・型の属性を宣言することになります。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="checked" format="boolean|reference"/>
<declare-styleable name="CompoundRelativeLayout">
<attr name="checked"/>
</declare-styleable>
<declare-styleable name="CompoundFrameLayout">
<attr name="checked"/>
</declare-styleable>
<declare-styleable name="CompoundGridLayout">
<attr name="checked"/>
</declare-styleable>
<declare-styleable name="CompoundLinearLayout">
<attr name="checked"/>
</declare-styleable>
</resources>
これで無事コンパイルできるようになりました。