我正在使用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中的TextAppearance:
<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正在工作)。但无法改变字体。
答案 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)
来将此方法用于字幕。