XML android:fontFamily 中的字体未应用于工具栏
Fonts in XML android:fontFamily is not applied to toolbars
我正在使用 XML 中的新字体功能,该功能是在 Android 8.0 Oreo 中引入的,支持库 26.1.0。通过在应用程序主题中设置 android:fontFamily
属性来应用整个应用程序的默认字体系列:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="android:fontFamily">@font/proxima_nova</item>
</style>
该字体已正确应用于应用程序中除工具栏之外的所有视图。所有工具栏继续使用 Roboto 字体:
更新:该问题似乎已在支持库 27.0.0 中修复。我不能再复制了。
我还没有测试所有 Android 版本,但这似乎有效:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="android:fontFamily">@font/proxima_nova</item>
<item name="toolbarStyle">@style/AppTheme.Toolbar</item>
</style>
<style name="AppTheme.Toolbar" parent="Widget.AppCompat.Toolbar">
<item name="titleTextAppearance">@style/AppTheme.ToolbarTextStyle</item>
</style>
<style name="AppTheme.ToolbarTextStyle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:fontFamily">@font/proxima_nova</item>
<item name="fontFamily">@font/proxima_nova</item>
</style>
我使用这个 util 方法为操作栏设置了不同字体的标题:
public static CharSequence createSpannableActionBarTitle(Context context, CharSequence title) {
SpannableString spannedTitle = new SpannableString(title);
int titleColor = context.getResources().getColor(R.color.white);
spannedTitle.setSpan(new ForegroundColorSpan(titleColor), 0, spannedTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannedTitle.setSpan(new TypefaceSpan(context, R.string.Roboto_Medium), 0, spannedTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannedTitle;
}
我花了很长时间来解决这个问题(即使使用支持库 27.1.0)。所以,这是我的解决方案:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:fontFamily">@font/proxima_nova</item> <!-- Default app font -->
<item name="actionBarStyle">@style/Custom.ActionBar</item>
</style>
<style name="Custom.ActionBar" parent="Widget.AppCompat.ActionBar">
<item name="background">@color/colorPrimary</item>
<item name="titleTextStyle">@style/Custom.ActionBar.Title</item>
</style>
<style name="Custom.ActionBar.Title" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:fontFamily">@font/proxima_nova_bold</item>
</style>
如您所见,我没有引用 Toolbar
,而是通过引用 ActionBar
来实现它。通过以上,整个应用程序的默认字体是 Proxima Nova (Regular),而 Toolbar/Action Bar 设置为 Proxima Nova Bold。
一些上下文:
对于我的生活,我无法使用字体 xml 来自定义字体(您应该在其中为常规和粗体设置普通和斜体字体)。因此,代码中的 @font/proxima_nova_bold
链接到字体文件本身 res/font/proxima_nova_bold.ttf
,效果很好。
如果你像往常一样使用字体
确保 activity 扩展 AppCompatActivity
当我的 activity 扩展 Activity 时无法呈现我的字体。
我正在使用 XML 中的新字体功能,该功能是在 Android 8.0 Oreo 中引入的,支持库 26.1.0。通过在应用程序主题中设置 android:fontFamily
属性来应用整个应用程序的默认字体系列:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="android:fontFamily">@font/proxima_nova</item>
</style>
该字体已正确应用于应用程序中除工具栏之外的所有视图。所有工具栏继续使用 Roboto 字体:
更新:该问题似乎已在支持库 27.0.0 中修复。我不能再复制了。
我还没有测试所有 Android 版本,但这似乎有效:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<item name="android:fontFamily">@font/proxima_nova</item>
<item name="toolbarStyle">@style/AppTheme.Toolbar</item>
</style>
<style name="AppTheme.Toolbar" parent="Widget.AppCompat.Toolbar">
<item name="titleTextAppearance">@style/AppTheme.ToolbarTextStyle</item>
</style>
<style name="AppTheme.ToolbarTextStyle" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:fontFamily">@font/proxima_nova</item>
<item name="fontFamily">@font/proxima_nova</item>
</style>
我使用这个 util 方法为操作栏设置了不同字体的标题:
public static CharSequence createSpannableActionBarTitle(Context context, CharSequence title) {
SpannableString spannedTitle = new SpannableString(title);
int titleColor = context.getResources().getColor(R.color.white);
spannedTitle.setSpan(new ForegroundColorSpan(titleColor), 0, spannedTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannedTitle.setSpan(new TypefaceSpan(context, R.string.Roboto_Medium), 0, spannedTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannedTitle;
}
我花了很长时间来解决这个问题(即使使用支持库 27.1.0)。所以,这是我的解决方案:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:fontFamily">@font/proxima_nova</item> <!-- Default app font -->
<item name="actionBarStyle">@style/Custom.ActionBar</item>
</style>
<style name="Custom.ActionBar" parent="Widget.AppCompat.ActionBar">
<item name="background">@color/colorPrimary</item>
<item name="titleTextStyle">@style/Custom.ActionBar.Title</item>
</style>
<style name="Custom.ActionBar.Title" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:fontFamily">@font/proxima_nova_bold</item>
</style>
如您所见,我没有引用 Toolbar
,而是通过引用 ActionBar
来实现它。通过以上,整个应用程序的默认字体是 Proxima Nova (Regular),而 Toolbar/Action Bar 设置为 Proxima Nova Bold。
一些上下文:
对于我的生活,我无法使用字体 xml 来自定义字体(您应该在其中为常规和粗体设置普通和斜体字体)。因此,代码中的 @font/proxima_nova_bold
链接到字体文件本身 res/font/proxima_nova_bold.ttf
,效果很好。
如果你像往常一样使用字体
确保 activity 扩展 AppCompatActivity
当我的 activity 扩展 Activity 时无法呈现我的字体。