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

Android多语言适配:如何根据设备系统语言动态切换fontFamily字体

Android多语言自动切换对应粗细字体解决方案

方案1:使用原生资源限定符(推荐,无需编写额外逻辑)

这个方案利用Android系统自带的资源匹配规则,不需要写代码就可以实现自动切换。

操作步骤

  1. 先将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。
  2. 在res目录下创建对应语言的values目录:
    • res/values-ar(阿拉伯语适配)
    • res/values-en(英语适配)
    • res/values-es(西班牙语适配)
  3. 每个语言的values目录下新建font_aliases.xml文件,分别定义对应语言的字体别名:
    阿拉伯语(values-ar/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-en/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>
    
    西班牙语(values-es/font_aliases.xml):
    <?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>
    
  4. 修改布局文件中的硬编码字体,替换为通用别名:
    <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切换字体),可以用代码动态设置。

实现步骤

  1. 先写一个字体提供工具类,根据当前系统语言和需要的字体粗细返回对应字体:
    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)
        }
    }
    
  2. 在代码中给对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:02