如何将样式应用于属于自定义视图的视图

How to apply style to a view that is part of a custom view

我想创建一个自定义视图,它基本上只是一个 LinearLayout,其中包含多个 ImageView。布局本身非常简单,因此不需要 xml,因为所有内容都添加到 init 块中。

问题是,我试图应用到 ImageView 的样式被忽略了。起初,我认为问题是,我通过 Icons 视图的自定义属性应用它, 但如果我直接通过 ImageView 的构造函数应用它,也会发生同样的情况.

无论如何我都会提供完整的代码,以防万一有人发现我做错了什么,尽管 getResourceId(R.styleable.Icons_iconsStyle, 0) returns 值不同于 0。

styles.xml中:

<style name="AppTheme.Icons">
    <item name="android:layout_width">30dp</item>
    <item name="android:layout_height">30dp</item>
    <item name="android:layout_margin">10dp</item>
</style>

attrs.xml中:

<declare-styleable name="Icons">
    <attr name="iconsStyle" format="reference" />
</declare-styleable>

Icons.kt:

class Icons @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {

    private val someIcon: ImageView

    init {
        @StyleRes
        val iconsStyle: Int

        context.theme.obtainStyledAttributes(attrs, R.styleable.Icons, 0, 0).apply {
            iconsStyle = getResourceId(R.styleable.Icons_iconsStyle, 0)

            recycle()
        }

        someIcon = ImageView(context, null, iconsStyle)
            .apply { 
                setImageResource(R.drawable.ic_icon) 
            }
            .also {
                addView(it)
            }
    }
}

fragment_layout.xml中:

<com.example.Icons
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:iconsStyle="@style/AppTheme.Icons" />

我还没弄清楚,所以我采用了更直接的方法:我没有使用 ImageView 的样式,而是直接从 dimens.[= 设置大小和边距13=]

这是最终结果:

class Icons @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {

    private val someIcon: ImageView

    init {

        val iconSize = resources.getDimensionPixelSize(R.dimen.icon_size)
        val margin = resources.getDimensionPixelSize(R.dimen.icon_margin)

        someIcon = ImageView(context, null)
            .apply { 
                setImageResource(R.drawable.ic_icon)
                layoutParams = LayoutParams(iconSize, iconSize).apply {
                    setMargins(margin)
                }
            }
            .also {
                addView(it)
            }
    }
}