2

私は 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 の質問を読んでいます...なぜこれがうまくいかないのですか?

4

1 に答える 1

1

カスタム属性の名前空間を宣言する必要があります。次のようになります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/auto"
    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"
         app:infoText="@string/fooButtonInfoText" />
 </LinearText>
于 2013-08-24T18:35:56.897 に答える