如何在Android中为整个应用程序设置自定义字体?


82

是否可以在Android应用程序中设置自定义字体?

我尝试过这里发布的内容,但是我不知道我在哪里extends Application课程...

有什么帮助吗?

编辑:

我尝试了以下方法:

  • 添加资产文件夹并在其中插入字体,如下所示:

在此处输入图片说明

  • 添加一个从 Application

  • 从我的学校叫这个新班AndroidManifest.xml

  • 我按照自己的风格进行了添加。

MyApp.java:

public class MyApp extends Application {
  @Override
  public void onCreate() {
     super.onCreate();
    FontsOverride.setDefaultFont(this, "DEFAULT", "raleway_regular.ttf");
    //  This FontsOverride comes from the example I posted above
  }
  }

AndroidManifest.xml:

<application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:name=".MyApp"
      android:theme="@style/AppTheme">
     ....

styles.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
 </style>

但是我的字体仍然没有变化...知道吗?

然后MyApp调用该类。但是对我的字体没有影响...

EDIT2:在为按钮设置自定义样式后,我意识到我的按钮将应用自定义字体。这是我的自定义按钮样式:

<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>

这是现在的样子:

在此处输入图片说明

所以:我的按钮正在应用样式,而不是在TextView。关于为什么我的自定义字体未应用到应用程序中的所有项目的任何想法?


您所提供的链接确实对您的问题有帮助。
Androider 2015年

我知道,我认为我的解决方案在那里...但是当我创建一个从Application扩展的类时,由于它说我的类从未使用过,所以我无法使其工作……
Sonhja 2015年

在我的答案中签出更多链接,似乎很有帮助,我的第一个链接确实更好,谢谢
Androider 2015年

Answers:


49

写一堂课

public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}

现在,接下来是在AndroidManifest.xml中,为应用程序标记提供应用程序类的名称。在这种情况下是MyApp

<application
android:name=".MyApp"
...
>
...
</application>

因此,每当打开App时,都会调用MyApp类的onCreate方法,并设置字体。

更新 将字体文件放置在asset / fonts / your_font_file.ttf下

将此行放在您的应用程序类(MyApp)的onCreate方法下

TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");

TypefaceUtil的源文件

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) {

        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Map<String, Typeface> newMap = new HashMap<String, Typeface>();
            newMap.put("serif", customFontTypeface);
            try {
                final Field staticField = Typeface.class
                        .getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            try {
                final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
                defaultFontTypefaceField.setAccessible(true);
                defaultFontTypefaceField.set(null, customFontTypeface);
            } catch (Exception e) {
                Log.e(TypefaceUtil.class.getSimpleName(), "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
            }
        }
    }
}

现在更新您的style.xml文件

将以下行的样式包含在清单文件中以供您进行活动

  <item name="android:typeface">serif</item>

希望这可以帮助


请让我知道您正在测试的Android OS版本。我观察到,在棒棒糖中,我们需要多做几周-Nitin
Mesta

请检查以下链接以获取适用于Lollipop和
早期

它更改了Toast消息,警报对话框中的所有应用字体,我不想在此使用自定义字体
Adil

1
我有一个疑问,许多制造商允许用户在系统范围内从设置更改字体,这种更改是否还会覆盖我们以编程方式设置的字体类型?
Bhuro

82

编辑

uk.co.chrisjenx:calligraphy现在不再为最新的android版本维护lib库,现在 https://github.com/InflationX/Calligraphy

dependencies {
    implementation 'io.github.inflationx:calligraphy3:3.1.1'
    implementation 'io.github.inflationx:viewpump:2.0.3'
}

将自定义字体添加到素材资源/

用法

对于默认字体

在#onCreate()方法的Application类中,使用CalligraphyConfig定义默认字体,然后将其传递给添加到ViewPump构建器的CalligraphyInterceptor。

@Override
public void onCreate() {
    super.onCreate();
    ViewPump.init(ViewPump.builder()
        .addInterceptor(new CalligraphyInterceptor(
                new CalligraphyConfig.Builder()
                    .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
                    .setFontAttrId(R.attr.fontPath)
                    .build()))
        .build());
    //....
}

注入上下文:包装活动上下文:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}

自订样式

<style name="TextViewCustomFont">
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

对于主题

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
    <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

解决方案下方的开发人员不再维护


android中有一个很棒的自定义字体库:Calligraphy
这是一个示例如何使用它。

在Gradle中,您需要将此行放入应用程序的build.gradle文件中:

        dependencies {
            compile 'uk.co.chrisjenx:calligraphy:2.2.0'
        }

然后创建一个扩展Application的类并编写以下代码:

        public class App extends Application {
            @Override
            public void onCreate() {
                super.onCreate();

                CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                                .setDefaultFontPath("your font path")
                                .setFontAttrId(R.attr.fontPath)
                                .build()
                );
            }
        } 

您应该在Assets /上创建一个“ New Directory”“ fonts”(请参见下文),因此在该代码中“您的字体路径”应为“ fonts / SourceSansPro-Regular.ttf”。(这只是“字体...”,而不是“ / fonts ..”或“ assets ..”。)

并在活动类中将此方法放在onCreate之前:

        @Override
        protected void attachBaseContext(Context newBase) {
            super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
        }

清单文件的最后一件事应如下所示:

        <application
           .
           .
           .
           android:name=".App">

它将整个活动更改为您的字体!简单干净!

在资产上,您应该右键单击“新建目录”,将其称为“字体”。在查找器中,将.ttf字体文件放在其中。

在此处输入图片说明

也不要忘记在attrs.xml中添加以下两行,如果您没有attrs.xml文件,请在values.xml中创建新文件

 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>

我正在使用ttf,但我非常确定.otf也可以正常工作,并且是将其放入资产文件夹的最佳位置。
Rajesh Nasit

将其放入扩展应用程序类CalligraphyConfig.initDefault(new CalligraphyConfig.Builder().setDefaultFontPath(“ fonts / GOTHAM-MEDIUM.ttf”).setFontAttrId(R.attr.fontPath).build()); 也不要忘记在values.xml中添加以下两行。<attr format =“ string” name =“ fontPath” /> <item name =“ calligraphy_tag_id” type =“ id” />
Rajesh Nasit

嗨@rajesh!您应该点击“编辑”,并将其添加到您的出色答案中!您是对的,应该是.ttf文件,对不起。
Fattie

1
您可以最大程度地使用片段。这样活动的数量将减少。
Rajesh Nasit

1
@Pawan做一步-我定义,其中一个简单的基类attachBaseContext(..)中实现,然后我所有的项目活动类(我想要的是自定义字体)扩展该基类
基因博

63

我所做的就是:

1:将“新资源目录”添加到RES文件夹,从给定的下拉列表中选择“ RESOURCE TYPE”作为“字体”,命名为新目录“ font”并保存。 新资源目录

2:将我的“ custom_font.ttf”添加到刚刚创建的FONT文件夹中。

3:在STYLES.XML的应用程序基础主题中添加了我的自定义字体

样式文件

完成。


4
您还必须创建一个字体系列。之后,它对我有用。此处的详细信息:developer.android.com/guide/topics/ui/look-and-feel/…–
keybee

它对我有用,而无需创建字体系列。但是,我不得不使用Gradle版本> 3,并将工具和支持库设置为27> @keybee
Numanqmr,

即使没有字体家族,对我来说也很棒
朱利安·阿尔贝托

您知道如何以编程方式更改它吗?
majov

@majov检查#Rajeesh的上述答案。那应该对你有帮助!
Numanqmr

12

您可以立即使用android SDK来完成此操作,这是在set / 2017在此处发布的Android Developer官方youtube频道。

需要API级别26(Android 8 Oreo)及以上。

您只需要将字体文件放入res/font文件夹中,并在TextView需要使用该android:fontFamily属性的特定字体文件时对其进行引用。

如果您想在整个应用程序中使用基本字体,只需输入

<item name="android:fontFamily">@font/yourfontname</item> 

在你的 styles.xml

您也可以从Android Studio下载自定义字体,也可以随时随地下载。您可以在上面的视频中找到所有这些详细信息。


此选项适用于API 26及更高版本。不是16岁以上
完美广场

修复API 23 +怎么样?
Raju yourPepe '19

12

Android提供了更简单,最好的解决方案,支持库26+在API级别14上提供了支持。XML中的字体它还支持字体系列选项。必需的导入: implementation "com.android.support:support-compat:<26+ version>"

遵循以下简单步骤,字体家族将毫无障碍地应用在您的应用中:

  1. res内创建一个字体目录
  2. 将字体文件粘贴到字体中
  3. 右键单击字体文件夹,然后转到新建>字体资源文件。出现“新资源文件”窗口。
  4. 添加以下属性
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>
  1. 在上面的xml文件中。仅使用应用程序来使用支持库。否则,如果您的应用程序的API级别为26+,则可以使用android
  2. 现在转到您的styles.xml并将其放在主样式的下面。
    <item name="android:fontFamily">@font/opensans</item>
    
  3. 重要提示:仅在使用支持库时,才使用AppCompatActivity
  4. 或使用以下方式以编程方式设置字体

    view.setTypeface(ResourcesCompat.getFont(context, R.font.opensans));
    

这种方式适用于当前的Android字体资源功能。谢谢。
azwar_akbar

2

似乎您正在使用android:fontFamily而不是在android:typefacestyles.xml

尝试更换

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
</style>

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:typeface">default</item>
</style>

1
以及如何将其与应用程序连接?谁扩展了它?
Sonhja 2015年

通过扩展,Application您可以轻松地创建ApplicationApplication类的子类。因此,您不需要连接它。
Suhas

怎么说从未使用过?
Suhas 2015年

您是否还在同一SO帖子中建议的在应用程序文件<item name="android:typeface">default</item>内添加行?<style name="AppTheme" parent="AppBaseTheme">res -> values -> styles.xml
Suhas 2015年

是的,它也不起作用。那就是我在编辑中
所做的

2

如果按照第一个主题,这应该工作:这里

是的,反思。这有效(基于此答案):

(注意:由于缺乏对自定义字体的支持,因此这是一种解决方法,因此,如果您要更改此情况,请在此处加注星号以投票赞成android问题)。注意:不要在该问题上留下“我也”评论,当您这样做时,所有盯着它的人都会收到一封电子邮件。所以请给它“加星号”。

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

public final class FontsOverride {

public static void setDefaultFont(Context context,
        String staticTypefaceFieldName, String fontAssetName) {
    final Typeface regular = Typeface.createFromAsset(context.getAssets(),
            fontAssetName);
    replaceFont(staticTypefaceFieldName, regular);
}

protected static void replaceFont(String staticTypefaceFieldName,
        final Typeface newTypeface) {
    try {
        final Field staticField = Typeface.class
                .getDeclaredField(staticTypefaceFieldName);
        staticField.setAccessible(true);
        staticField.set(null, newTypeface);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
}

然后,您需要重载一些默认字体,例如在应用程序类中:

public final class Application extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");
        FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");
        FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");
        FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");
    }
}

或者当然,如果您使用的是相同的字体文件,则可以对此进行改进以仅将其加载一次。

但是,我倾向于只重写一个,说“ MONOSPACE”,然后设置一种样式来强制该字体应用程序范围广泛:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:typeface">monospace</item>
    </style>
</resources>

API 21 Android 5.0

我在评论中调查了报告,认为该报告无效,并且似乎与主题android:Theme.Material.Light不兼容。

如果该主题对您不重要,请使用较旧的主题,例如:

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:typeface">monospace</item>
</style>

1

在主文件夹中创建资产文件夹,在其中添加字体文件夹。在字体文件夹中添加您的.ttf文件。

在您的应用主题中添加以下内容:

 <item name="android:fontFamily">@font/roboto_regular</item>
    <item name="fontFamily">@font/roboto_regular</item>

创建类为TypefaceUtil

 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","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}

在应用程序类或Launcher活动中调用它

        TypefaceUtil.overrideFont(getApplicationContext(), "fonts/roboto_regular.ttf", "fonts/roboto_regular.ttf"); // font from assets: "assets/fonts/Roboto-Regular.ttf

1
  1. 首先,您应该右键单击您的项目资源,res然后单击名称,然后从new选项中选择Android Resource Directory并选择font表单Resource type,然后按OK,这将创建字体目录以在其中放置字体。

在此处输入图片说明

  1. 将您的.ttf字体文件放在那里。

在此处输入图片说明

  1. 转到存在于以下路径中的项目样式文件,res/values/styles.xml 并添加类似的样式:

    <style name="SansSerifFont">
        <item name="android:fontFamily">sans-serif</item>
    </style>
    
    <style name="OpenSansFont">
        <item name="android:fontFamily">@font/open_sans</item>
    </style>
    
    <style name="IranianSansFont">
        <item name="android:fontFamily">@font/iranian_sans</item>
    </style>
    
    <style name="BYekanFont">
        <item name="android:fontFamily">@font/b_yekan</item>
    </style>
    
    <style name="DroidArabicFont">
        <item name="android:fontFamily">@font/droid_arabic</item>
    </style>
    
  2. 转到您的代码并编写这样的类以更改整个应用程序字体:

    public class AppFontManager {
    
        private AppCompatActivity appCompatActivity;
    
        public static final String SANS_SERIF_APP_FONT = "sans_serif";
        public static final String B_YEKAN_APP_FONT = "b_yekan";
        public static final String DROID_ARABIC_APP_FONT = "droid_arabic";
        public static final String IRANIAN_SANS_APP_FONT = "iranian_sans";
        public static final String OPEN_SANS_APP_FONT = "open_sans";
    
        public AppAppearanceManager(AppCompatActivity appCompatActivity) {
            this.appCompatActivity = appCompatActivity;
        }
    
        public void setFont(String fontName){
    
            switch (fontName){
    
                case SANS_SERIF_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.SansSerifFont, true);
                    break;
                }
    
                case B_YEKAN_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.BYekanFont, true);
                    break;
                }
    
                case DROID_ARABIC_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.DroidArabicFont, true);
                    break;
                }
    
                case IRANIAN_SANS_APP_FONT:{
                appCompatActivity.getTheme().applyStyle(R.style.IranianSansFont, true);
                    break;
                }
    
                case OPEN_SANS_APP_FONT:{
                    appCompatActivity.getTheme().applyStyle(R.style.OpenSansFont, true);
                    break;
                }
            }
        }
    }
    

    因为应该为每个活动分别设置字体,所以我更愿意为它编写一个类以获取更简洁的代码。

  3. 然后在活动onCreate之前调用类方法super.onCreate(savedInstanceState)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        new AppAppearanceManager(this).setFont(APP_DEFAULT_FONT);
        super.onCreate(savedInstanceState);
    // Do you stuff there...
    }
    

    请记住,如果要在运行时更改字体,请在SharedPreferences或等中编写选定的字体,然后将选定的字体传递给setFont上述所有活动。


0

首先,创建一个新类,该类将覆盖您要自定义的任何View。(例如,想要一个带有自定义字体的Button吗?Extend Button)。例如:

public class CustomButton extends Button {
    private final static int ROBOTO = 0;
    private final static int ROBOTO_CONDENSED = 1;

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

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        parseAttributes(context, attrs); //I'll explain this method later
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        parseAttributes(context, attrs);
    }
}

现在,如果没有的话,请在下方添加一个XML文档res/values/attrs.xml,然后添加:

<resources>
    <!-- Define the values for the attribute -->
    <attr name="typeface" format="enum">
        <enum name="roboto" value="0"/>
        <enum name="robotoCondensed" value="1"/>
    </attr>

    <!-- Tell Android that the class "CustomButton" can be styled, 
         and which attributes it supports -->
    <declare-styleable name="CustomButton">
        <attr name="typeface"/>
    </declare-styleable>
</resources>

好的,在此之前,让我们回到parseAttributes()前面的方法:

private void parseAttributes(Context context, AttributeSet attrs) {
    TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);

    //The value 0 is a default, but shouldn't ever be used since the attr is an enum
    int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);

    switch(typeface) {
        case ROBOTO: default:
            //You can instantiate your typeface anywhere, I would suggest as a 
            //singleton somewhere to avoid unnecessary copies
            setTypeface(roboto); 
            break;
        case ROBOTO_CONDENSED:
            setTypeface(robotoCondensed);
            break;
    }

    values.recycle();
}

现在您已经准备就绪。您可以为任何事物添加更多属性(可以为typefaceStyle添加另一个属性-粗体,斜体等),现在让我们看看如何使用它:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.yourpackage.name.CustomButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me!"
        custom:typeface="roboto" />

</LinearLayout>

xmlns:custom行实际上可以是任何东西,但是约定如上所示。重要的是它是唯一的,这就是使用软件包名称的原因。现在,您只需custom:为属性使用前缀,并android:为android属性使用前缀。

最后一两件事:如果你想在风格(使用这个res/values/styles.xml),你应该xmlns:custom行。只需引用没有前缀的属性名称即可:

<style name="MyStyle>
    <item name="typeface">roboto</item>
</style>

0

我也尝试过字体覆盖,但是最后这不是一个可靠的解决方案,可悲的是覆盖字体要花更多的钱。您可以等待带有自定义字体的Android O发布,也可以使用第三方库。

我遇到的最后一个解决方案是该库Caligraphy,该库易于初始化,并允许您使用任意数量的字体。在检查其源代码时,我了解了为什么仅覆盖字体无法工作,所以即使您不打算使用它,我也建议您仔细阅读一次。

祝好运


是的..也许 无论如何让我们知道您是否找到了这个问题的原因,我们将不胜感激。即使读取底层代码,我也找不到解决方案。
Keivan Esbati

0

试试下面的代码,它对我有用,希望对您也有帮助。

public class BaseActivity extends AppCompatActivity {

private Typeface typeace;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    typeace = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name));
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    overrideFonts(this,getWindow().getDecorView());
}

private void overrideFonts(final Context context, final View v) {
    try {
        if (v instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) v;
            for (int i = 0; i < vg.getChildCount(); i++) {
                View child = vg.getChildAt(i);
                overrideFonts(context, child);
         }
        } else if (v instanceof TextView) {
            ((TextView) v).setTypeface(typeace);
        } else if (v instanceof EditText ) {
            ((EditText) v).setTypeface(typeace);
        } else if (v instanceof Button) {
            ((Button) v).setTypeface(typeace);
        }
    } catch (Exception e) {
 }
 }
}

现在,将此BaseActivity扩展到您的任何Activity,或者如果您正在使用,则可以为fragment创建相同的类。

注意:-如果要设置某些视图的不同字体,则必须以编程方式如下设置

private Typeface typeface;
typeface = Typeface.createFromAsset(getAssets(), getResources().getString(R.string.font_name_bold));
tvUserName.setTypeface(typeface);

因此,请尝试一下,让我知道,如果我可以进一步帮助您


0

Kotlin的解决方案是这个

解决方案的要点https://gist.github.com/Johnyoat/040ca5224071d01b3f3dfc6cd4d026f7

步骤1

将字体文件放在assets / fonts / your_font_file.ttf下,并创建一个名为TypeFaceUtil的kotlin类

   class TypefaceUtil{

    fun overridefonts(context: Context, defaultFontToOverride:String, customFontFileNameInAssets:String){
        try {
            val customTypeface = Typeface.createFromAsset(context.assets,customFontFileNameInAssets)
            val defaultTypefaceField = Typeface::class.java.getDeclaredField(defaultFontToOverride)
            defaultTypefaceField.isAccessible = true
            defaultTypefaceField.set(null,customTypeface)
        }catch (e:Exception){
            Timber.e("Cannot set font $customFontFileNameInAssets instead of $defaultFontToOverride")
        }
    }
}

第二步 然后在onCreate

val typefaceUtil = TypefaceUtil()

typefaceUtil.overridefonts(this,"SERIF","fonts/font_file.ttf")

第三步

将此添加到您的样式

<item name="android:typeface">serif</item>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.