对于一个特定的功能,我需要实现一个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)
}
Run Code Online (Sandbox Code Playgroud)
在我的 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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么即使我的子类根本不做任何其他事情,我也需要手动设置字体?我是否错过了一些super()配置字体所需的调用?如果已知字体问题,从 xml 属性中提取字体并避免在代码中对其进行硬编码的标准方法是什么?
小智 6
您需要扩展 AppCompatTextView 因为默认情况下在 XML 中导入 AppCompatTextView 但如果创建一个新组件您需要导入 AppCompatTextView 而不是 TextView ;)
| 归档时间: |
|
| 查看次数: |
254 次 |
| 最近记录: |