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

