使用书法更改我的工具栏的字体

时间:2016-11-22 14:58:14

标签: android toolbar

我正在使用Calligraphy lib for Android更改应用中的字体。 问题出在工具栏上。我不知道如何更改字体。

这是我的工具栏:

<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:titleTextAppearance="@style/Toolbar.TitleText"
            android:background="@drawable/background_repeat"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

这是我的style.xml中的T​​extAppearance:

<style name="Toolbar.TitleText" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="fontPath">fonts/Raleway-ExtraBoldItalic.ttf</item>
        <item name="android:textSize">50sp</item>
    </style>

这不起作用。我可以更改文本的大小(在此示例中,50sp正在工作)。但无法改变字体。

4 个答案:

答案 0 :(得分:2)

问题在于工具栏在其内部以编程方式为标题和副标题创建TextView。 这意味着它不使用书法包装的LayoutInflater。 相反,它使用系统字体,具体取决于textFppearence属性中的fontFamily和fontStyle。

但是书法听取了GlobalLayout的变化并尝试从主题加载样式。

所以我做了什么:

添加活动主题并自定义ActionBarStyle:

<style name="ActivityTheme" parent="AppTheme.Base">
    <item name="android:actionBarStyle">@style/ActionBarStyle</item>
</style>

<style name="ActionBarStyle" parent="Widget.AppCompat.Light.ActionBar.Solid">
    <item name="android:titleTextStyle">@style/ToolbarTitleTextAppearance</item>
</style>

<style name="ToolbarTitleTextAppearance" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textSize">20sp</item>
    <item name="fontPath">fonts/Roboto-Medium.ttf</item>
</style>

答案 1 :(得分:0)

有两种方法可以做到这一点

1)通过在style.xml文件中使用样式AnoDest告诉你

2)通过使用xml,您可以通过这种方式获得对视图的更多控制,您需要创建名为appbar.xml的seprate xml文件并将其包含在视图中

appbar.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/gradient_theme"
    android:elevation="@dimen/smallPadding"
    android:fitsSystemWindows="true">

    <com.indussoft.lms.customUI.TextViewRobotoBold
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity Name"
        android:textStyle="bold"
        android:textSize="@dimen/okTextSize"
        android:layout_gravity="center"
        android:gravity="center"
        android:visibility="visible"
        android:textColor="@color/white" />

      <TextView
        android:layout_width="wrap_content"
        android:text="@string/accept"
        fontPath="fonts/Roboto-Bold.ttf"
        android:layout_height="wrap_content" />

</android.support.v7.widget.Toolbar>  

并将其包含在您的活动视图中,例如

 <include
        layout="@layout/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

答案 2 :(得分:0)

没有什么对我有用,所以这是我在我的基础活动中编写的功能来解决这个问题:

private void setToolBarFont() {
    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    for (int i = 0; i < toolbar.getChildCount(); i++) {
        final View child = toolbar.getChildAt(i);
        if (child instanceof TextView) {
            final TextView textView = (TextView) child;
            CalligraphyUtils.applyFontToTextView(textView, TypefaceUtils.load(getAssets(), "fonts/my_font.ttf"));
        }
    }
}

P.S。这是目前Calligraphy的GitHub页面上的一个公开问题。这是该问题的链接: https://github.com/chrisjenx/Calligraphy/issues/295

答案 3 :(得分:0)

如果您不想或无法覆盖工具栏主题,则可以对工具栏进行子类化,并使用自定义工具栏代替系统工具栏:

public class ToolbarPlus extends Toolbar {

    public ToolbarPlus(Context context) {
        super(context);
    }

    public ToolbarPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ToolbarPlus(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setTitle(CharSequence title) {
        if (title == null) {
            title = "";
        }
        Typeface font = TypefaceUtils.load(getResources().getAssets(), "fonts/Roboto-BoldItalic.ttf");
        super.setTitle(CalligraphyUtils.applyTypefaceSpan(title, font));
    }

}

用字体替换“ fonts / Roboto-BoldItalic.ttf”。

您还可以通过覆盖public void setSubtitle(CharSequence subtitle)来将此方法用于字幕。