如何为应用程序中的所有文本设置fontFamily?

时间:2017-02-17 08:02:28

标签: android

我希望应用中的每个文字都是sans-serif-thin,但我不知道如何更改它。我可以将android:fontFamily="sans-serif-thin"添加到TextView并且效果很好,但我不想在每个活动中更改每个TextView的代码。

我尝试将<item name="android:fontFamily">sans-serif-thin</item>添加到AppTheme中的styles.xml样式,但不起作用。

2 个答案:

答案 0 :(得分:2)

  

如何为应用中的所有文字设置fontFamily?

<强>解决方案

如果你只想使用android-default-font(sans,serif,mono)。

试试这个。

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-thin</item>
</style>

其他

如果要将custom font指定为默认字体,可以使用Calligraphy库。该库提供了与字体相关的各种功能。

答案 1 :(得分:0)

如果您需要为Android应用程序中的所有TextView设置一种字体,您可以使用此解决方案。它将覆盖所有TextView的字体,包括操作栏和其他标准组件,但EditText的密码字体不会被覆盖。

public class MyApp extends Application {

@Override
 public void onCreate() {
   TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); // font from assets: "assets/fonts/Roboto-Regular.ttf
 }
}

别忘了添加android:name =&#34; com.you.yourapp.MyApp&#34;在Manifest文件的应用程序标签中。

在style.xml中添加主题

<?xml version="1.0" encoding="utf-8"?>
 <resources>
  <style name="MyAppTheme" parent="@android:style/Theme.Holo.Light">
   <!-- you should set typeface which you want to override with TypefaceUtil -->
   <item name="android:typeface">serif</item>
  </style>
</resources>

创建一个类TypefaceUtil.java

import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;
import java.lang.reflect.Field;

public class TypefaceUtil {

/**
 * Using reflection to override default typeface
 * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE    WHICH WILL BE OVERRIDDEN
 * @param context to work with assets
 * @param defaultFontNameToOverride for example "monospace"
 * @param customFontFileNameInAssets file name of the font from assets
 */
 public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
    try {
        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
        defaultFontTypefaceField.setAccessible(true);
        defaultFontTypefaceField.set(null, customFontTypeface);
    } catch (Exception e) {
        Log.e("Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
    }
 }
}