【问题标题】:how to set specific font family for each locale in jetpack compose如何在jetpack compose中为每个语言环境设置特定的字体系列
【发布时间】:2021-12-19 06:22:15
【问题描述】:

在 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 folder 中创建一个 style.xml 文件,并以更改字体系列的方式编辑 style.xml。但是这种方法在使用 Compose 时不起作用。

那么我怎样才能为每个区域设置不同的字体系列呢?

【问题讨论】:

  • 将这些字体放到同名的不同字体区域并在您的应用中使用。
  • 感谢您的回复,但我没听懂!能详细解释一下吗?

标签: android locale android-jetpack-compose font-family


【解决方案1】:

如果你想实现这一点,你需要遵循以下一些步骤:

  1. 这些字体应该是相同的名称,并放在不同的字体区域设置文件夹中。

  2. 使用该字体名称定义FontFamily

    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. 在你的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)
    }
    

英语和西班牙语语言环境的结果如下:

【讨论】:

    【解决方案2】:

    不确定是否有更好的方法,但我认为可以使用简单的策略模式来实现。
    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(),但收到警告,并且似乎无法正常工作。你有什么实现本地化的想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2011-03-26
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多