34

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

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" />

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

4

3 に答える 3

50

「配列参照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();
    }
}

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

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

これはまさにListViewクラスで行われる方法です (ソースを見てください)。

于 2013-01-03T17:56:13.740 に答える
19

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

<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();
于 2016-06-03T07:19:10.657 に答える