如何允许覆盖 Android 中的库的字体系列

How to allow to override the font family of a library in Android

我制作了一个包含可视组件的 Android 库。此组件样式必须由主托管应用程序通过资源文件自定义。

为了让字体系列可以自定义,我定义了一个字符串

<string name="customizableFontFamily" translatable="false">sans-serif</string>

主旋律中使用的样式:

<style name="MyMainTheme" parent="Theme.AppCompat.Light.NoActionBar">
   <item name="android:fontFamily">@string/customizableFontFamily</item>

这在使用基本 Android 字体(休闲字体、等宽字体、无衬线字体等)时效果很好。但是,如果用户想要定义自定义字体,则它不起作用,因为它必须指向一个引用:

<string name="customizableFontFamily" translatable="false">@font/myFont</string>

有什么办法可以做到吗?

您可以定义一个自定义 TextAppearance 并更改您的 ui 组件以使用它而不是简单的 fontFamily。

类似于:

<style name="TextAppearance.MyApp.Headline1" parent="TextAppearance.MaterialComponents.Headline1">
  ...
  <item name="fontFamily">@font/custom_font</item>
  <item name="android:textStyle">normal</item>
  <item name="android:textAllCaps">false</item>
  <item name="android:textSize">64sp</item>
  <item name="android:letterSpacing">0</item>
  ...
</style>

通过这种方式,使用您的库的应用程序可以自定义这些值。
很快,Material 设计库中包含的所有组件都将引用这些主题文本属性。
你可以阅读 more here.