关于Android 的自定义 View 中单个属性传入一组数据的方案

2023-12-14 21:44:43

关于Android 的自定义 View 中单个属性传入一组数据的方案

一、自定义 View 传入一组图片

在 Android 的自定义 View 中,你可以使用属性(attr)来接收一组图片资源,但是属性的类型应该是 reference,而不是直接的图片资源。

以下是一个示例,展示如何定义一个接收一组图片资源的自定义属性:

  1. res/values/attrs.xml 文件中定义属性:
<resources>
    <declare-styleable name="CustomView">
        <attr name="imageList" format="reference" />
    </declare-styleable>
</resources>
  1. 在你的自定义 View 类中使用该属性:
public class CustomView extends View {
    private List<Integer> imageList;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
        int imageArrayId = typedArray.getResourceId(R.styleable.CustomView_imageList, 0);
        if (imageArrayId != 0) {
            TypedArray imageTypedArray = getResources().obtainTypedArray(imageArrayId);
            imageList = new ArrayList<>();
            for (int i = 0; i < imageTypedArray.length(); i++) {
                int resourceId = imageTypedArray.getResourceId(i, 0);
                if (resourceId != 0) {
                    imageList.add(resourceId);
                }
            }
            imageTypedArray.recycle();
        }
        typedArray.recycle();
    }

    // ...
}

在上述示例中,我们定义了一个名为 imageList 的属性,其类型为 reference,表示它可以接收一组图片资源。在自定义 View 的构造函数中,我们获取到该属性值的资源 ID,并使用 obtainTypedArray() 方法来获取到 TypedArray,然后遍历该数组获取每个图片资源的 ID,并将其添加到 imageList 中。最后,记得在使用完 TypedArray 后进行回收(recycle())。

通过以上步骤,你就可以在 XML 中为自定义 View 指定一组图片资源了:

<com.example.CustomView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:imageList="@array/my_images" />

请确保在 res/values/arrays.xml 文件中定义 my_images 数组资源,并在其中指定每个图片资源的 ID:

<resources>
    <array name="my_images">
        <item>@drawable/image1</item>
        <item>@drawable/image2</item>
        <item>@drawable/image3</item>
    </array>
</resources>

这样,在自定义 View 中就可以使用 imageList 属性中的图片资源了。

需要注意的是,属性 attr 只能接收资源 ID,而不是直接的图片对象。因此,你需要在 XML 中指定资源 ID,并在代码中根据这些 ID 获取实际的图片资源。

二、自定义 View 传入一组字符串

在 Android 的自定义 View 中,属性(attr)通常用于接收基本类型的值,如整数、布尔值、颜色等。然而,如果你想传入一组字符串(String),可以使用字符串数组(String[])的形式来实现。

以下是一个示例,展示如何定义一个接收一组字符串的自定义属性:

  1. res/values/attrs.xml 文件中定义属性:
<resources>
    <declare-styleable name="CustomView">
        <attr name="stringArray" format="string" />
    </declare-styleable>
</resources>
  1. 在你的自定义 View 类中使用该属性:
public class CustomView extends View {
    private String[] stringArray;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
        int stringArrayId = typedArray.getResourceId(R.styleable.CustomView_stringArray, 0);
        if (stringArrayId != 0) {
            stringArray = getResources().getStringArray(stringArrayId);
        }
        typedArray.recycle();
    }

    // ...
}

在上述示例中,我们定义了一个名为 stringArray 的属性,其类型为 string,表示它可以接收一组字符串。在自定义 View 的构造函数中,我们获取到该属性值的资源 ID,并使用 getStringArray() 方法来获取到字符串数组。最后,记得在使用完 TypedArray 后进行回收(recycle())。

通过以上步骤,你就可以在 XML 中为自定义 View 指定一组字符串了:

<com.example.CustomView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:stringArray="@array/my_strings" />

请确保在 res/values/arrays.xml 文件中定义 my_strings 字符串数组资源,并在其中指定每个字符串:

<resources>
    <string-array name="my_strings">
        <item>String 1</item>
        <item>String 2</item>
        <item>String 3</item>
    </string-array>
</resources>

这样,在自定义 View 中就可以通过 stringArray 属性获取到传入的一组字符串了。

需要注意的是,属性 attr 只能接收资源 ID,而不是直接的字符串数组对象。因此,你需要在 XML 中指定字符串数组的资源 ID,并在代码中根据这个 ID 获取实际的字符串数组。

文章来源:https://blog.csdn.net/weixin_44008788/article/details/134967205
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。