对于特定功能,我需要实现一个自定义TextView
,它将使用spannables来设置文本样式。一切正常,除了自定义视图使用的字体似乎是默认字体而不是我指定的字体。减少到触发我创建此类的问题的最小代码:
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中,只需将小部件从TextView
更改为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属性中提取字体的标准方法是什么,并避免在代码中对其进行硬编码?
答案 0 :(得分:4)
您需要扩展AppCompatTextView,因为默认情况下在XML中导入AppCompatTextView但是如果创建一个新组件则需要导入AppCompatTextView而不是TextView;)
答案 1 :(得分:0)
为什么我们需要创建一个仅用于使用字体系列的自定义视图,TextView已经支持此功能。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/avenir_font"/>