繁体   English   中英

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

[英]Why does my custom TextView not inherit the font?

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

您需要扩展AppCompatTextView,因为在XML中默认情况下会导入AppCompatTextView,但是如果要创建新组件,则需要导入AppCompatTextView而不是TextView;)

为什么我们需要创建一个仅用于使用字体系列的自定义视图,TextView已支持此功能。

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/avenir_font"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM