使用数组引用作为自定义android视图的XML属性

此问题已解决,请参阅注释以获取详细信息。

我正在扩展现有的Android视图并加载一些自定义属性,如使用XML声明自定义Android UI元素和定义自定义attrs中所述 。

具有布尔和整数格式的属性可以正常工作,但是当我尝试指定对数组资源的引用时,应用程序在启动时崩溃。 我在xml资源文件中定义了一个整数数组,我试图将它用作自定义视图的属性。

我可以使用数组资源来设置android Spinner类的“entries”属性而没有错误,所以它似乎是我的实现中的一个问题。 logcat消息似乎没有提供有关崩溃的任何具体信息,但我仍然在寻找,所以如果我find了什么,我会更新。

属性由(在attrs.xml中)声明:

    

该数组定义为(在arrays.xml中):

  1 2 3  

我通过以下方式引用数组:

  

这会导致应用程序立即崩溃。 此外,如果我引用颜色资源而不是数组,那么应用程序不会崩溃。 有谁知道如何处理这个问题?

Solutions Collecting From Web of "使用数组引用作为自定义android视图的XML属性"

只是在这里捎带你的问题,因为你的post首先出现,如果你谷歌像“数组引用XML属性自定义视图”,所以有人可能会发现这有用。

如果您希望自定义视图引用字符串数组 ,则可以使用Android现有的android:entries XML属性,而不是创建全新的自定义属性。

只需在res/values/attrs.xml执行以下res/values/attrs.xml

      

然后在自定义View的构造函数中执行此操作:

 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类中的完成方式(在源代码中查看,你会看到)。

迟到的答案,如果数组是一个字符串数组,另一个答案很有效。 但是,当数组是引用数组时,例如arr.getTextArray(...)

  @drawable/a @drawable/b  

会给你res/drawable/a.png作为charsequence而不是资源id。

解析引用数组的正确方法如下:

 final TypedArray arr = c.obtainStyledAttributes(attrs, R.styleable.CustomView); final int arrayResourceId = arr.getResourceId( R.styleabe.CustomView_CustomAttr, 0); if (arrayResourceId != 0) { final TypedArray resourceArray = res.obtainTypedArray(arrayResourceId); for (int i = 0; i < resourceArray.length(); i++) { final int resourceId = resourceArray.getResourceId(i, 0); // do stuff with resourceId, such as res.getDrawable(resourceId) } resourceArray.recycle(); } arr.recycle(); 

问题是关于获取整数数组,对于我的情况,我需要从数组中读取颜色(int)以用于我的自定义视图,styeable definition如下所示:

    

然后我使用我的自定义视图,如下所示:

  

颜色定义如下:

  #FF9800  #000000 #E65100 @color/colorPrimary   

所以我需要在我的自定义视图(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 

希望这会对一些人有所帮助。