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

Android开发:Kotlin动态创建TextView时设置fontFamily遇阻

动态创建TextView:设置fontFamily及代码修正

一、设置android:fontFamily="sans-serif-medium"的两种方法

在Kotlin中可以通过以下两种方式实现系统中等字重字体的设置:

方法1:直接通过Typeface创建

// 指定系统字体家族,可同时设置字重样式
genericTextView.setTypeface(Typeface.create("sans-serif-medium", Typeface.BOLD))

不需要加粗时,将第二个参数替换为Typeface.NORMAL即可。

方法2:使用ResourcesCompat兼容获取(推荐)

这种方式对不同Android版本兼容性更好:

val mediumFont = ResourcesCompat.getFont(context, android.R.font.sans_serif_medium)
genericTextView.typeface = mediumFont
// 需要加粗时叠加设置
genericTextView.setTypeface(mediumFont, Typeface.BOLD)

二、现有代码的问题修正

你的代码存在几处需要调整的地方,避免运行时崩溃或显示异常:

1. 字符串资源获取错误

当前代码中genericTextView.text = R.string.No_projects.toString()会把资源ID转为数字字符串,正确写法是:

genericTextView.text = context.getString(R.string.No_projects)

2. LayoutParams初始化与dp转px

直接修改layoutParams可能导致空指针,且setMargins的参数是像素,XML中的8dp需要转换为适配屏幕的像素值:

// 先创建LayoutParams实例
val textLayoutParams = ConstraintLayout.LayoutParams(
    ConstraintLayout.LayoutParams.WRAP_CONTENT,
    ConstraintLayout.LayoutParams.WRAP_CONTENT
).apply {
    // 调用扩展函数将dp转为像素
    setMargins(0, 8.dpToPx(context), 0, 8.dpToPx(context))
}
genericTextView.layoutParams = textLayoutParams

// 新增dp转px扩展函数(可放在任意顶层文件或类中)
fun Int.dpToPx(context: Context): Int {
    return (this * context.resources.displayMetrics.density).toInt()
}

3. 字体样式叠加冲突

先调用setTextAppearance再设置setTypeface可能导致样式冲突,建议先设置fontFamily,再调整字重,或直接合并设置(参考方法1的代码)。

4. 约束设置的优化

约束部分可简化为apply块直接操作,无需额外变量:

(genericTextView.layoutParams as ConstraintLayout.LayoutParams).apply {
    endToEnd = ConstraintSet.PARENT_ID
    topToTop = ConstraintSet.PARENT_ID
    startToStart = ConstraintSet.PARENT_ID
    bottomToBottom = ConstraintSet.PARENT_ID
    horizontalBias = 0.5f
    verticalBias = 0.5f
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:55:20