web-dev-qa-db-ja.com

カスタムのXML属性として配列参照を使用するAndroidビュー

この問題は解決されました。詳細についてはコメントを参照してください。

XMLを使用したカスタムAndroid UI要素の宣言 および カスタム属性の定義 で説明されているように、既存のAndroidビューを拡張していくつかのカスタム属性をロードしています。 。

ブール形式と整数形式の属性は正常に機能しますが、配列リソースへの参照を指定しようとすると、アプリケーションが起動時にクラッシュします。 xmlリソースファイル内に整数配列を定義し、それをカスタムビューの属性として使用しようとしています。

配列リソースを使用して、Android Spinnerクラスの「entries」属性をエラーなしで設定できるため、実装に問題があるようです。 logcatメッセージはクラッシュに関する特定の情報を提供していないようですが、私はまだ探しているので、何かを見つけたら更新します。

属性は(attrs.xmlで)によって宣言されます:

<declare-styleable name="CustomView">
    <attr name="values" format="reference"/>
    <attr name="isActive" format="boolean"/>
</declare-styleable>

配列は(arrays.xmlで)次のように定義されます。

<integer-array name="nums">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</integer-array>

そして、私は次の方法で配列を参照しています:

<com.test.CustomView cv:values="@array/nums" />

これにより、アプリケーションがすぐにクラッシュします。さらに、配列ではなくカラーリソースを参照しても、アプリケーションはクラッシュしません。誰かがこの問題に対処する方法を知っていますか?

31
Michael

「配列参照XML属性カスタムビュー」のようなものをグーグルで検索すると投稿が最初に表示されるので、ここで質問をおんぶしてください。誰かがこれを役立つと思うかもしれません。

カスタムビューで文字列の配列を参照する場合は、まったく新しいものを作成する代わりに、Androidの既存のAndroid:entriesXML属性を使用できます。カスタム属性。

res/values/attrs.xmlで次の手順を実行してください。

<resources>
    <declare-styleable name="MyCustomView">
        <attr name="Android:entries" />
    </declare-styleable>
</resources>

次に、カスタムビューのコンストラクターでこれを行います。

public MyCustomView(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);

    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);
    try
    {
        CharSequence[] entries = a.getTextArray(R.styleable.MyCustomView_Android_entries);
        if (entries != null)
        {
           //do something with the array if you want
        }
    }
    finally
    {
        a.recycle();
    }
}

そして、カスタムビューをXMLレイアウトファイルに追加するときに、Android:entries属性を介して文字列配列を参照できるはずです。例:

<com.example.myapp.MyCustomView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:entries="@array/my_array_of_strings" />

これはまさに ListView クラスで行われる方法です(ソースを見るとわかります)。

43

他の答えは文字列の配列でうまく機能します。ただし、arr.getTextArray(...) on 参照の配列、例:.

<array name="tmp">
  <item>@drawable/a</item>
  <item>@drawable/b</item>
</array>

あなたにres/drawable/a.pngリソースIDの代わりにCharSequenceとして。

参照の配列を解析する適切な方法は次のとおりです。

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);

int arrayResourceId = typedArray.getResourceId(R.styleable.CustomView_CustomAttr, 0);
if (arrayResourceId != 0) {
    final TypedArray resourceArray = getResources().obtainTypedArray(arrayResourceId);
    for (int i = 0; i < resourceArray.length(); i++) {
        final int resourceId = resourceArray.getResourceId(i, 0);

        // do stuff with resourceId, such as getResources().getDrawable(resourceId)
    }
    resourceArray.recycle();
}
typedArray.recycle();
15
Jin

質問は整数配列を取得することです。私の場合、カスタムビューの配列からcolors(int)を読み取る必要があります。これは、以下のように固定可能な定義です。

<declare-styleable name="ColorPickerView">
        <attr name="colors" format="reference" />
    </declare-styleable>

次に、以下のようなカスタムビューを使用します。

<com.rainliu.colorpicker.ColorPickerView
    Android:id="@+id/rtePalette"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    colorPickerView:colors="@array/colorPickerColors"
    />

色の定義は次のとおりです。

<resources>
    <color name="colorPrimary">#FF9800</color>
    <array name="colorPickerColors">
        <item>#000000</item>
        <item>#E65100</item>
        <item>@color/colorPrimary</item>
    </array>
</resources>

したがって、カスタムビュー(ColorPickerView)で色を取得する必要があります。コードは次のとおりです。

TypedArray ta = context.obtainStyledAttributes(attributeSet, R.styleable.ColorPickerView);
int colorsId = ta.getResourceId(R.styleable.ColorPickerView_colors, 0);
int[] colorsArray = ta.getResources().getIntArray(colorsId);
for (int a : colorsArray) {
  Log.e("AA", "color == " + a);
}
ta.recycle();

これがcolorsArrayのプリントです:

03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -16777216
03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -1683200
03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -1683200

これが何人かの人を助けることを願っています。

4
LiuWenbin_NO.