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

如何允许在Android中覆盖库的字体系列,android,android-resources,Android,Android Resources,我制作了一个包含可视组件的Android库。主宿主应用程序必须通过资源文件自定义此组件样式 为了让字体族可以自定义,我定义了一个字符串 <string name="customizableFontFamily" translatable="false">sans-serif</string> 无衬线 在主主题样式中使用: <style name="MyMainTheme" parent="Theme.AppCompat.Light.NoActionBar">

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

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

<string name="customizableFontFamily" translatable="false">sans-serif</string>
无衬线
在主主题样式中使用:

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

@字符串/可自定义的leFontFamily
当使用基本的Android字体(休闲、单空格、无衬线等)时,这很好用。但是,如果用户想要定义自定义字体,则无法使用,因为它必须指向引用:

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

有什么方法可以做到这一点吗?

您可以定义一个自定义的
文本外观
,并将您的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>

...
@字体/自定义字体
正常的
假的
64便士
0
...
通过这种方式,使用lib的应用程序可以自定义这些值。
很快,材质设计库中包含的所有组件都将引用这些主题文本属性。

你可以读。

我认为这个答案很好。在我的例子中,我只想更改所有文本的字体族,因此我创建了一个样式,它继承了TextAppearance.AppCompat,只定义了fontfamily,并扩展到我库的所有元素。这很容易被添加我的库的应用程序覆盖,因此我是一个完美的解决方案。