对于一个特定的特性,我需要实现一个自定义
TextView
这将使用西班牙风格的文本。一切正常,除了自定义视图使用的字体似乎是默认字体,而不是我指定的字体。减少到触发我创建此类的问题的最小代码:
class DummyTextViewBad : TextView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
}
在我的xml中,只需从
文本视图
到
DummyTextViewBad
使字体(avenir)消失并使用系统默认值进行渲染。但是,如果我像这样手动设置字体,它可以工作:
class DummyTextViewGood : TextView {
constructor(context: Context?) : super(context) {
setAvenir(context)
}
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
setAvenir(context)
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
setAvenir(context)
}
fun setAvenir(context: Context?) {
try {
typeface = ResourcesCompat.getFont(context!!, R.font.avenir_font)
} catch (e: Exception) {
println("Failed to set font");
}
}
}
为什么我需要手动设置字体,即使我的子类没有做任何其他事情?我错过了一些需要的吗
super()
调用以配置字体?如果字体问题是已知的,那么
提取液
XML属性中的字体并避免在代码中硬编码?