为什么我的自定义 TextView 没有继承字体?

Grz*_*icz 1 fonts android

对于一个特定的功能,我需要实现一个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 ;)