将数组引用作为自定义 Android 视图的 XML 属性

24 浏览
0 Comments

将数组引用作为自定义 Android 视图的 XML 属性

这个问题已经被解决了,请查看评论获取详细信息。

我正在扩展一个现有的Android View并加载一些自定义属性,如使用XML声明自定义Android UI元素定义自定义attr所描述的那样。

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

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

这些属性由attrs.xml中声明:

    
    

该数组定义为arrays.xml中:

    1
    2
    3

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


这会导致应用程序立即崩溃。此外,如果我引用颜色资源而不是数组,则应用程序不会崩溃。有人知道如何解决这个问题吗?

admin 更改状态以发布 2023年5月20日
0
0 Comments

其他答案对于字符串数组很有效。然而,在引用数组上,例如:


  @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();

0
0 Comments

如果您想让自定义视图引用一个字符串数组,您可以使用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类中的做法(查看源代码,您将看到)。

0