如何在Jetpack Compose中为每个区域设置特定的字体族?

3
在Jetpack Compose中,您可以通过编辑type文件来设置特定的字体:
val MyFont= FontFamily(
    Font(R.font.myfont, FontWeight.Normal)
)

// Set of Material typography styles to start with
val Typography = Typography(
    body1 = TextStyle(
        fontFamily = MyFont,
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp
    ),
    button = TextStyle(
        fontFamily = MyFont,
        fontWeight = FontWeight.SemiBold,
        fontSize = 14.sp
    ),
    defaultFontFamily = MyFont
)

但我的问题是我有多个语言环境,并且我想为每个语言环境设置特定的字体。

在使用Compose之前,我的方法是在每个语言的values文件夹中创建一个style.xml文件,并以改变字体系列的方式编辑style.xml。但是使用Compose时,这种方法行不通。

那么我怎样才能为每个语言环境设置不同的字体系列呢?


将这些字体放到相应的字体区域中,并使用相同的名称在您的应用程序中使用。 - Liem Vo
谢谢您的回复,但我没有理解!您能详细解释一下吗? - Mohammad Derakhshan
2个回答

3

如果您想实现这一目标,需要按照以下步骤进行:

  1. These fonts should be the same name and put in the different font locale folder. Put fonts in different folder

  2. Define FontFamily with that font name

    val myFontFamily = FontFamily(
        Font(R.font.lato_light, FontWeight.Light),
        Font(R.font.lato_regular, FontWeight.Normal),
        Font(R.font.lato_italic, FontWeight.Normal, FontStyle.Italic),
        Font(R.font.lato_regular, FontWeight.Medium),
        Font(R.font.lato_bold, FontWeight.Bold)
    )
    
  3. Use in your Text

    val text = "Hello Android Developers"
    Column(Modifier.fillMaxWidth().padding(16.dp)) {
        Text(text, fontFamily = myFontFamily, fontWeight = FontWeight.Light)
        Text(text, fontFamily = myFontFamily, fontWeight = FontWeight.Medium)
        Text(text, fontFamily = myFontFamily, fontStyle = FontStyle.Italic)
    }
    
以下是英语和西班牙语区域设置的结果: 在不同的区域设置中,文本字体将有所不同(en&es)

我已经尝试过这个方法,但是字体直到应用程序重新启动才会改变,有什么解决办法吗?https://stackoverflow.com/questions/76498248/font-resources-doesnt-change-after-changing-locale-in-jetpack-compose - Mohsen Einhesari

0

不确定是否有更好的方法,但我认为可以使用简单的策略模式来实现。
fontFamily创建一个接口,即:

interface MyFont {
    fun getBody1FontFamily()
    fun getButtonFontFamily()
}

然后实现它,即:

class EnglishFont: MyFont {
   fun getBody1FontFamily() = // font for body1 on English locale
   fun getButtonFontFamily() = // font for button on English locale
}

class KoreanFont: MyFont {
   fun getBody1FontFamily() = // font for body1 on Korean locale
   fun getButtonFontFamily() = // font for button on Korean locale
}

然后,在您的可组合函数中,您可以基于语言环境创建myFont对象,并将该对象注入到Typography中。

val Typography = Typography(
    body1 = TextStyle(
        fontFamily = myFont.getBody1FontFamily(),
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp
    ),
    button = TextStyle(
        fontFamily = myFont.getButtonFontFamily(),
        fontWeight = FontWeight.SemiBold,
        fontSize = 14.sp
    ),
    defaultFontFamily = MyFont
)

谢谢你的回复。但是你确定我可以在“type”文件内检查语言环境吗?我尝试使用“Locale.getDefault()”,但是出现了警告,似乎它不能正常工作。你有任何想法实现本地化吗? - Mohammad Derakhshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接