如何将样式应用于属于自定义视图的视图
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)
}
}
}
我想创建一个自定义视图,它基本上只是一个 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)
}
}
}