为什么我的自定义TextView不能继承字体?

时间:2018-06-18 09:39:37

标签: android fonts

对于特定功能,我需要实现一个自定义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属性中提取字体的标准方法是什么,并避免在代码中对其进行硬编码?

2 个答案:

答案 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"/>