将数组引用作为自定义 Android 视图的 XML 属性
将数组引用作为自定义 Android 视图的 XML 属性
这个问题已经被解决了,请查看评论获取详细信息。
我正在扩展一个现有的Android View并加载一些自定义属性,如使用XML声明自定义Android UI元素和定义自定义attr所描述的那样。
布尔格式和整数格式的属性可以正常工作,但是当我尝试指定对数组资源的引用时,应用程序在启动时崩溃。我已经在xml资源文件中定义了一个整数数组,并尝试将其用作自定义视图的属性。
我可以使用数组资源来设置android Spinner类的“entries”属性而没有错误,所以这似乎是我的实现中的问题。 logcat消息似乎没有提供有关崩溃的具体信息,但我仍在寻找,如果我找到了什么,我会进行更新。
这些属性由attrs.xml中声明:
该数组定义为arrays.xml中:
1 2 3
我正在通过以下方式引用数组:
这会导致应用程序立即崩溃。此外,如果我引用颜色资源而不是数组,则应用程序不会崩溃。有人知道如何解决这个问题吗?
admin 更改状态以发布 2023年5月20日
其他答案对于字符串数组很有效。然而,在引用数组上,例如:
- @drawable/a
- @drawable/b
使用arr.getTextArray(...)
会将res/drawable/a.png
作为CharSequence返回,而不是资源id。
正确解析引用数组的方法是:
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();
如果您想让自定义视图引用一个字符串数组,您可以使用Android现有的android:entries
XML属性,而不是创建一个全新的自定义属性。
在res/values/attrs.xml
中使用以下代码:
然后在自定义视图的构造函数中执行以下操作:
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
属性引用字符串数组。示例:
这正是在ListView类中的做法(查看源代码,您将看到)。