首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android中为整个应用程序设置自定义字体?

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

Stack Overflow用户
提问于 2015-11-26 02:21:30
回答 14查看 91.7K关注 0票数 88

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

我尝试了发布的here,但我不知道我的extends Application类在哪里……

有什么帮助吗?

编辑:

我尝试了以下几种方法:

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

从my AndroidManifest.xml.

  • I中添加一个从Application

  • Call扩展的新类,转到my style并添加它。

MyApp.java:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
 </style>

但是我的字体还是不是长宁的……有什么想法吗?

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

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

代码语言:javascript
复制
<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>

下面是它现在的样子:

所以:我的按钮是应用样式,而不是TextView。你知道为什么我的自定义字体没有应用于应用程序中的所有项目吗?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2015-11-26 02:29:20

写一个类

代码语言:javascript
复制
public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}

现在下一件事是在应用程序标记AndroidManifest.xml中为您的应用程序类提供名称。在本例中,它是MyApp

代码语言:javascript
复制
<application
android:name=".MyApp"
...
>
...
</application>

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

更新将font文件放在assets/fonts/your_font_file.ttf下

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

代码语言:javascript
复制
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");

TypefaceUtil的源文件

代码语言:javascript
复制
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文件

将清单文件中包含的您的活动样式放在下面一行

代码语言:javascript
复制
  <item name="android:typeface">serif</item>

希望这能有所帮助

票数 51
EN

Stack Overflow用户

发布于 2017-02-14 13:54:55

编辑

对于最新的uk.co.chrisjenx:calligraphy版本,android Lib没有更多的维护,替代版本现在是https://github.com/InflationX/Calligraphy

代码语言:javascript
复制
dependencies {
    implementation 'io.github.inflationx:calligraphy3:3.1.1'
    implementation 'io.github.inflationx:viewpump:2.0.3'
}

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

用法

对于默认字体

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

代码语言:javascript
复制
@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());
    //....
}

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

代码语言:javascript
复制
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
}

自定义样式

代码语言:javascript
复制
<style name="TextViewCustomFont">
    <item name="fontPath">fonts/RobotoCondensed-Regular.ttf</item>
</style>

对于主题

代码语言:javascript
复制
<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中,你需要把这一行放到你的应用的build.gradle文件中:

代码语言:javascript
复制
        dependencies {
            compile 'uk.co.chrisjenx:calligraphy:2.2.0'
        }

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

代码语言:javascript
复制
        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/ a "New Directory“"fonts”(见下文)上进行了设置,因此在该代码中“您的字体路径”应该是"fonts/SourceSansPro-Regular.ttf“。(这只是“字体...”不是"/fonts..“或“资产..”)

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

代码语言:javascript
复制
        @Override
        protected void attachBaseContext(Context newBase) {
            super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
        }

清单文件的最后一件事应该是:

代码语言:javascript
复制
        <application
           .
           .
           .
           android:name=".App">

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

在Assets上,您应该右键单击New Directory,将其称为"fonts“。在查找器中,将.ttf字体文件放入其中。

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

代码语言:javascript
复制
 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>
票数 81
EN

Stack Overflow用户

发布于 2018-02-07 15:48:44

我所做的就是:

1:在RES文件夹中添加"new resource directory“,在给出的下拉列表中选择"font”资源类型,将新目录命名为"font“并保存。

2:将我的custom_font.ttf添加到刚刚创建的字体文件夹中。

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

好了。

票数 77
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33923803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档