如何在 Android 中使用数据绑定布局将字体系列设置为编辑文本

Mar*_*ner 1 data-binding android

我为我的活动创建一个数据模型,如下所示:

data class ActivityModel (
    var font: Int
)
Run Code Online (Sandbox Code Playgroud)

并在活动中将值设置为该字体,如下所示:

items.font = R.font.san_francisco
Run Code Online (Sandbox Code Playgroud)

最后,在 XML 布局中使用它,如下所示:

android:fontFamily="@{ResourcesCompat.getFont(context, items.font)}"
Run Code Online (Sandbox Code Playgroud)

我还将此变量导入到 XML 布局中:

    <import type="androidx.core.content.ContextCompat"/>
    <import type="androidx.core.content.res.ResourcesCompat"/>
Run Code Online (Sandbox Code Playgroud)

但通过这种方式,应用程序不会构建,并且java(生成的)目录中出现错误。

那么,如何将字体系列设置为编辑文本?

Ibr*_*mad 5

您可以使用绑定适配器来完成此操作,如下所示:

1-创建字体类型作为枚举类以包含所有字体:

enum class FontsTypes(@FontRes val fontRes: Int) {
    CAIRO_REGULAR(R.font.font_cairo_regular),
    CAIRO_BOLD(R.font.font_cairo_bold),
    CAIRO_SEMI_BOLD(R.font.font_cairo_semi_bold)
}
Run Code Online (Sandbox Code Playgroud)

2-创建一个有趣的绑定适配器:

@BindingAdapter("font")
fun TextView.font( type: FontsTypes) {
    try {
        typeface = ResourcesCompat.getFont(context, type.fontRes)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}
Run Code Online (Sandbox Code Playgroud)

3-在 xml 中导入 FontsTypes :

<data>      
  <import type="<replace_with_path>.FontsTypes"/>
</data>
Run Code Online (Sandbox Code Playgroud)

4-从 xml 调用它:

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            font="@{model.selected ? FontsTypes.CAIRO_BOLD : FontsTypes.CAIRO_SEMI_BOLD }" />
Run Code Online (Sandbox Code Playgroud)