如何允许覆盖 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.
我制作了一个包含可视组件的 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.