Android多语言适配:如何根据设备系统语言动态切换fontFamily字体
Android多语言自动切换对应粗细字体解决方案
方案1:使用原生资源限定符(推荐,无需编写额外逻辑)
这个方案利用Android系统自带的资源匹配规则,不需要写代码就可以实现自动切换。
操作步骤
- 先将9款字体文件全部放入
res/font目录,确保文件名和你定义的一致:ar_light_font.ttf、ar_medium_font.ttf、ar_bold_font.ttf、en_light_font.ttf、en_medium_font.ttf、en_bold_font.ttf、es_light_font.ttf、es_medium_font.ttf、es_bold_font.ttf。 - 在
res目录下创建对应语言的values目录:res/values-ar(阿拉伯语适配)res/values-en(英语适配)res/values-es(西班牙语适配)
- 每个语言的values目录下新建
font_aliases.xml文件,分别定义对应语言的字体别名:
阿拉伯语(values-ar/font_aliases.xml):
英语(values-en/font_aliases.xml):<?xml version="1.0" encoding="utf-8"?> <resources> <item name="light_font" type="font">@font/ar_light_font</item> <item name="medium_font" type="font">@font/ar_medium_font</item> <item name="bold_font" type="font">@font/ar_bold_font</item> </resources>
西班牙语(values-es/font_aliases.xml):<?xml version="1.0" encoding="utf-8"?> <resources> <item name="light_font" type="font">@font/en_light_font</item> <item name="medium_font" type="font">@font/en_medium_font</item> <item name="bold_font" type="font">@font/en_bold_font</item> </resources><?xml version="1.0" encoding="utf-8"?> <resources> <item name="light_font" type="font">@font/es_light_font</item> <item name="medium_font" type="font">@font/es_medium_font</item> <item name="bold_font" type="font">@font/es_bold_font</item> </resources> - 修改布局文件中的硬编码字体,替换为通用别名:
<TextView android:id="txt1" android:fontFamily="@font/bold_font" /> <TextView android:id="txt2" android:fontFamily="@font/light_font" /> <TextView android:id="txt3" android:fontFamily="@font/medium_font" />
配置完成后,系统会自动根据当前设备语言匹配对应的values目录,加载对应语言的字体,切换系统语言后Activity重建就会自动生效。
方案2:代码动态设置字体(适合需要自定义控制的场景)
如果你需要手动控制字体切换逻辑(比如不需要重启Activity切换字体),可以用代码动态设置。
实现步骤
- 先写一个字体提供工具类,根据当前系统语言和需要的字体粗细返回对应字体:
object FontProvider { // weight参数可选值:light、medium、bold fun getFontByWeight(context: Context, weight: String): Typeface? { val currentLang = Locale.getDefault().language val fontName = when(currentLang) { "ar" -> "ar_${weight}_font" "en" -> "en_${weight}_font" "es" -> "es_${weight}_font" else -> "en_${weight}_font" // 未适配语言默认 fallback 到英语 } val fontResId = context.resources.getIdentifier(fontName, "font", context.packageName) return ResourcesCompat.getFont(context, fontResId) } } - 在代码中给对应TextView设置字体:
// 设置粗体 txt1.typeface = FontProvider.getFontByWeight(this, "bold") // 设置细体 txt2.typeface = FontProvider.getFontByWeight(this, "light") // 设置中体 txt3.typeface = FontProvider.getFontByWeight(this, "medium")
注意事项
- 若使用方案1,如果你在Manifest中给Activity配置了
android:configChanges="locale"禁止了系统重建,需要自行在onConfigurationChanged回调中刷新所有TextView的字体。 - 建议始终添加缺省适配逻辑,遇到未支持的语言时 fallback 到默认字体,避免出现找不到资源的异常。
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

