ViewAとViewBの両方に「title」タグを付けたい。しかし、これを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"はすでに定義されています。 別の質問 この解決策を示しています:
<?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_title
とR.styleable.ViewB_title
は生成されません。次のコードを使用してAttributeSetから属性を読み取るためにそれらが必要です。
TypedArray a=getContext().obtainStyledAttributes( as, R.styleable.ViewA);
String title = a.getString(R.styleable.ViewA_title);
どうすればこれを解決できますか?
あなたが投稿したリンクはあなたに正しい答えを与えます。これはあなたがすることを示唆していることです:
<?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_title
およびR.styleable.ViewB_title
両方ともアクセス可能です。
機会があれば、この回答を読んでください: リンク 。関連する引用:
最上位の要素または要素の内部で属性を定義できます。複数の場所でattrを使用する場合は、ルート要素に配置します。
継承を使用する必要があります
<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);
代わりにこれを行ってください。 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
で宣言されると、別のdeclare-styleable
で再度宣言する必要がない(また宣言できない)ためです。
<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>
これは大丈夫でした!!