当前位置: 首页 > 知识库问答 >
问题:

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

袁增
2023-03-14

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

我尝试了这里发布的内容,但我不知道我的扩展应用程序类在哪里。。。

有什么帮助吗?

编辑:

我尝试了以下方法:

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

>

从我的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">
     ....

样式。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。知道为什么我的自定义字体没有应用于应用程序中的所有项目吗?

共有3个答案

邹杰
2023-03-14

编写一个类

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>

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

更新“资产/字体/您的\u font\u文件”下的“放置字体文件”。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>

希望这能有所帮助

王楚青
2023-03-14

编辑

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

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

将您的自定义字体添加到资产/

用法

对于默认字体

在应用程序类的#onCreate()方法中,使用CalligraphyConfig定义默认字体,并将其传递给添加到ViewPump builder的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中有一个很棒的自定义字体库:书法
下面是一个如何使用它的示例

在Gradle中,您需要将这一行放到应用程序的构建中。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()
                );
            }
        } 

您应该在资产/新目录上创建字体(见下文),因此在该代码中,您的字体路径应该是字体/SourceSansPro-Regular.ttf。(只是字体...不是/fonts...或资产...)

在activity类中,将此方法置于onCreate之前:

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

清单文件的最后一项内容如下所示:

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

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

在资产上,您应该右键单击新目录,称之为“字体”。在查找器中输入<代码>。ttf中的字体文件。

也不要忘记在属性中添加以下两行。xml,如果没有属性。xml文件,在值中创建新文件。xml

 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>
谷翰飞
2023-03-14

我所做的就是:

2: 将我的“custom\u font.ttf”添加到刚刚创建的字体文件夹中。

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

完成。

 类似资料:
  • 问题内容: 我需要为整个应用程序使用某些字体。我有同样的.ttf文件。是否可以在应用程序启动时将此字体设置为默认字体,然后在应用程序中的其他位置使用它?设置后,如何在布局XML中使用它? 问题答案: 是的,反思。这有效(基于此答案): (注意:由于缺乏对自定义字体的支持,因此这是一种解决方法,因此,如果你要更改此情况,请在此处加注星号以投票赞成android问题)。注意:请勿在该问题上留下“我也”

  • 我想更改整个应用程序组件(文本视图、编辑文本、按钮等)的字体。我发现我可以为应用程序设置样式,但在这里我无法将字体从资产文件夹放入自定义样式xml。我必须将我的自定义TTF字体从资产文件夹放到样式xml中的typeface元素中。我无法将单空间字体更改为自定义字体。我的风格是

  • 我正在应用程序中使用Roboto light字体。要设置字体,我必须向每个视图添加。有什么方法可以将Roboto字体声明为整个应用程序的默认字体家族吗?我试过这样,但似乎不起作用。

  • 编辑: 我的理解可能是错误的,但这是一个不同于以编程方式设置语言环境的问题,因为我已经实现了那里建议的答案,我仍然有一些问题。 在这个问题中,我请求帮助解决这些问题(在设置的语言环境中没有参考的问题)。 原始帖子 我试图在我的应用程序中实现自定义语言环境,并遇到几个问题。 在调用setContentView之前,我在所有活动中使用以下代码: 编辑: 我还测试了它与: 我添加到Android中的所有

  • 我最近在Android Studio中为我的Android项目添加了一个自定义字体(遵循这些说明)。这不是一个显示文本的常规字体,而是一个包含大量图标的自定义字体,在我的应用程序中使用。 这个很管用。然而,现在一些用户报告了这个问题,他们的设备上只有一些图标可以使用,而许多其他图标显示为字符。所有用户的共同点是,他们在设备设置中配置了一个自定义的FONT/主题,这似乎覆盖了应用程序的样式。因此,应

  • 问题内容: 我知道,只需在屏幕上设置元素的自定义字体即可。 我想知道如何使用swift为整个应用程序设置它。(破解将是针对应用程序的每个元素执行我所知道的操作,但这只会成为可维护性的噩梦) 我看到这个问题已经用Objective-C标签问过,如何在不指定大小的情况下为整个iOS应用设置自定义字体,但我对Objective-C不够熟悉,不足以将代码移植到Swift 问题答案: 您可以设置UILabe