You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Kotlin修改Android字体?解决tvThanks为空指针异常

解决Android自定义字体设置时TextView为空的问题

嘿,这个tvThanks must not be null的空指针问题我之前也碰到过,本质就是你在TextView还没被加载出来的时候就去访问它了,咱们一步步来解决:

核心原因:视图初始化时机不对

你是在Fragment的onCreate方法里设置字体的,但这个阶段Fragment的布局还没完成inflation(也就是还没加载出来),这时候不管是用kotlin synthetic直接引用,还是用findViewById,拿到的控件都会是null。Fragment里操作视图的正确时机是onViewCreated方法——这时候视图已经完全创建好了。

具体解决步骤

1. 把字体设置代码移到正确的生命周期方法里

修改你的Fragment代码,把字体初始化的逻辑放到onViewCreated中:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 这里可以安全访问tvThanks了
    val typeFace = Typeface.createFromAsset(requireContext().assets, "dinpro_medium.ttf")
    tvThanks.setTypeface(typeFace)
}

如果是用ViewBinding(推荐这种方式,比synthetic更安全),代码应该是这样:

private var _binding: ContatoEnviadoFragmentBinding? = null
private val binding get() = _binding!!

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    _binding = ContatoEnviadoFragmentBinding.inflate(inflater, container, false)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val typeFace = Typeface.createFromAsset(requireContext().assets, "dinpro_medium.ttf")
    binding.tvThanks.typeface = typeFace
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null // 防止内存泄漏
}

2. 检查字体文件的存放路径

确保你的dinpro_medium.ttf文件放在src/main/assets/目录下:

  • 文件名要完全匹配(大小写敏感!比如不能写成DinPro_Medium.ttf)
  • 如果放在assets的子文件夹里(比如assets/fonts/),路径要写成"fonts/dinpro_medium.ttf"

3. 验证控件ID的一致性

检查XML布局里的TextView ID@+id/tvThanks和代码里引用的tvThanks是不是完全一致,有没有拼写错误(比如少写了一个s,或者大小写不对)。

额外提醒

如果之后还是遇到字体不生效的问题,还可以检查:

  • 字体文件本身有没有损坏,可以换个字体文件测试下
  • 有没有在其他地方(比如主题、style)覆盖了TextView的字体设置

内容的提问来源于stack exchange,提问作者gorous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:43:38