私は android.widget.Button を拡張しようとしており、res/values/strings.xml の値への参照を保持する必要があるスタイル可能な属性をカスタム ウィジェットに追加しました。
<resources>
<attr name="infoText" format="reference" />
<declare-styleable name="FooButton">
<attr name="infoText" />
</declare-styleable>
</resources
私のレイアウトでは、次のようなものがあります。
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">
<com.example.FooButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/fooButton"
infoText="@string/fooButtonInfoText" />
</LinearText>
私の res/values/strings.xml は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fooButtonInfoText">BAR</string>
</resources>
カスタム FooButton での属性値の抽出は次のようになります。
TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.FooButton);
Integer infoTextId = typedArray.getResourceId(R.styleable.FooButton_infoText, 0);
if (infoTextId > 0) {
infoText = context.getResources().getString(infoTextId);
}
typedArray.recycle();
これらの 3 つのコンストラクターを実装しました。
public FooButton(Context context) {
super(context);
}
public FooButton(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
setInfoText(context, attributeSet);
}
public FooButton(Context context, AttributeSet attributeSet, int defStyle) {
super(context, attributeSet, defStyle);
setInfoText(context, attributeSet);
}
メソッドFooButton.setInfoText(context, attributeSet)は、FooButton が宣言されるたびに呼び出されます。
私はこの問題と長い間戦っていて、何十もの Stackoverflow の質問を読んでいます...なぜこれがうまくいかないのですか?