この問題は解決されました。詳細についてはコメントを参照してください。
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" />
これにより、アプリケーションがすぐにクラッシュします。さらに、配列ではなくカラーリソースを参照しても、アプリケーションはクラッシュしません。誰かがこの問題に対処する方法を知っていますか?
「配列参照XML属性カスタムビュー」のようなものをグーグルで検索すると投稿が最初に表示されるので、ここで質問をおんぶしてください。誰かがこれを役立つと思うかもしれません。
カスタムビューで文字列の配列を参照する場合は、まったく新しいものを作成する代わりに、Androidの既存のAndroid:entries
XML属性を使用できます。カスタム属性。
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 クラスで行われる方法です(ソースを見るとわかります)。
他の答えは文字列の配列でうまく機能します。ただし、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();
質問は整数配列を取得することです。私の場合、カスタムビューの配列から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
これが何人かの人を助けることを願っています。