如何用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
相关产品推荐
相关产品推荐

