我创建了自定义视图。
代码在这里:
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)
我做错了什么?
谢谢。
答案 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) {