XML中的字体android:fontFamily未应用于工具栏

6
我正在使用Android 8.0 Oreo中引入的Support Library 26.1.0中的新Fonts in XML功能。通过在应用程序主题中设置android:fontFamily属性,可以应用整个应用程序的默认字体系列。请注意,保留HTML标签。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     ...
    <item name="android:fontFamily">@font/proxima_nova</item>
</style>

除了工具栏,应用程序中的所有视图都正确应用了字体。所有工具栏仍然使用Roboto字体:

enter image description here

更新:问题似乎已在支持库27.0.0中得到解决,我无法再次复现它。

4个回答

10

我还没有在所有的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>

2
谢谢,这可能是一个解决方法,但最终目标是所有视图都能够在不需要手动样式的情况下进行样式设置。我已经在Google问题跟踪器中创建了一个工单:https://issuetracker.google.com/issues/68308866。 - makovkastar
1
我认为在 AppTheme 中的 android:fontFamily 导致了工具栏的变化,而不是 toolbarStyle。当我在 AppTheme 下使用没有默认字体的代码时,它不会对工具栏文本进行样式设置。 - Aba
@Aba,你找到任何解决方案了吗? - Jorge
嗨@Jorge。是的,我已经将我的解决方案添加为答案。 - Aba

1

我花了很长时间才弄清楚这个问题(即使使用了支持库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>

正如您所看到的,我成功地使用了ActionBar而不是Toolbar。以上代码将整个应用程序的默认字体设置为Proxima Nova(常规),而工具栏/操作栏则设置为Proxima Nova Bold。 一些背景信息:
我试图使用字体xml来设置正常和斜体字体,但却无法让自定义字体起作用。因此,代码中的@font/proxima_nova_bold链接到字体文件本身res/font/proxima_nova_bold.ttf,这样做可以正常工作。

0

如果您想像平常一样使用字体

请确保活动(activity)扩展自 AppCompatActivity

当我的活动(activity)扩展自 Activity 时,我的字体无法渲染。


0

我使用了这个工具方法来将具有不同字体的标题设置到操作栏中:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接