自定义视图的默认样式

时间:2020-08-12 09:54:57

标签: android

我创建了自定义视图。
代码在这里:

class MyView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.style.myStyle) :
    LinearLayout(context, attrs, defStyleAttr) {

    init {
        View.inflate(context, R.layout.my_view, this)
    }
}

此处的布局:

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:style="@style/my_style">

    ...

</merge>

样式在这里:

    <style name="MyStyle">
        <item name="android:paddingTop">8dp</item>
        <item name="android:paddingBottom">8dp</item>
    </style>

我将视图添加到活动布局:

<MyView       
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"       
            android:background="#00ff00" />

我的视图没有MyStyle的顶部/底部填充。
但是,如果我以编程方式添加视图,一切正常:

v = MyView(ContextThemeWrapper(this, R.style.myStyle), null, 0)
v.setBackgroundColor(resources.getColor(R.color.my_color))
rootView.addView(v)

我做错了什么?
谢谢。

1 个答案:

答案 0 :(得分:0)

defStyleAttr 是主题属性,而不是样式。

您必须在attrs.xml中进行定义:

 <attr format="reference" name="myAttr"/>

然后在您的应用主题中:

<style name="AppTheme" parent="...">
    <item name="myAttr">@style/MyStyle</item>
</style>

<style name="MyStyle">
    <item name="android:paddingTop">8dp</item>
    <item name="android:paddingBottom">8dp</item>
</style>

最后:

class MyView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.style.myAttr) :
    LinearLayout(context, attrs, defStyleAttr) {