代码之家  ›  专栏  ›  技术社区  ›  Grzegorz Adam Hankiewicz

为什么我的自定义文本视图不继承字体?

  •  0
  • Grzegorz Adam Hankiewicz  · 技术社区  · 7 年前

    对于一个特定的特性,我需要实现一个自定义 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)
    }
    

    在我的xml中,只需从 文本视图 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 回复  |  直到 7 年前
        1
  •  4
  •   Javier Rebollo    7 年前

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

        2
  •  0
  •   GianhTran    7 年前

    为什么我们只需要创建一个自定义视图来使用字体系列,textview已经支持这个了。

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