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

Son*_*hja 68 android

是否可以在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
  }
  }
Run Code Online (Sandbox Code Playgroud)

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">
     ....
Run Code Online (Sandbox Code Playgroud)

styles.xml:

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:fontFamily">default</item>
 </style>
Run Code Online (Sandbox Code Playgroud)

但我的字体仍然没有变换......任何想法?

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

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

<style name="MyButtonStyle" parent="Widget.AppCompat.Button">
    <item name="textAllCaps">false</item>
    <item name="android:textAllCaps">false</item>
</style>
Run Code Online (Sandbox Code Playgroud)

以下是它现在的样子:

在此输入图像描述

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

Raj*_*sit 75

在android中有一个很棒的自定义字体库:书法
以下是如何使用它的示例.

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

        dependencies {
            compile 'uk.co.chrisjenx:calligraphy:2.2.0'
        }
Run Code Online (Sandbox Code Playgroud)

然后创建一个扩展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()
                );
            }
        } 
Run Code Online (Sandbox Code Playgroud)

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

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

        @Override
        protected void attachBaseContext(Context newBase) {
            super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
        }
Run Code Online (Sandbox Code Playgroud)

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

        <application
           .
           .
           .
           android:name=".App">
Run Code Online (Sandbox Code Playgroud)

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

在资产上,您应该右键单击"新建目录",将其命名为"fonts".在finder中将.ttf字体文件放在那里.

在此输入图像描述

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

 <attr format="string" name="fontPath"/> 
    <item name="calligraphy_tag_id" type="id"/>
Run Code Online (Sandbox Code Playgroud)


Nit*_*sta 47

写一堂课

public class MyApp extends Application{
// Put the onCreate code as you obtained from the post link you reffered
}
Run Code Online (Sandbox Code Playgroud)

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

<application
android:name=".MyApp"
...
>
...
</application>
Run Code Online (Sandbox Code Playgroud)

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

更新 将字体文件置于assets/fonts/your_font_file.ttf下

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

TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/your_font_file.ttf");
Run Code Online (Sandbox Code Playgroud)

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在更新style.xml文件

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

  <item name="android:typeface">serif</item>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 我有一个疑问,许多制造商允许用户从设置中更改系统范围内的字体,这种更改是否也会覆盖我们以编程方式设置的字体类型? (2认同)

Num*_*qmr 42

我所做的只是:

1:在RES文件夹中添加"新资源目录",从下拉列表中选择RESOURCE TYPE作为"font",命名为新目录"font"并保存. 新资源目录

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

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

STYLES.XML

DONE.

  • 您还必须创建一个字体系列。之后,它对我有用。此处的详细信息:https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html (2认同)

小智 10

您可以使用Android SDK现在就这样做,为Android开发者官方YouTube频道组/ 2017年发表在这里.

需要API级别26(Android 8 Oreo)及更高版本.

您只需将字体文件放在res/font文件夹中,并在TextView需要具有该android:fontFamily属性的特定文件时引用它们.

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

<item name="android:fontFamily">@font/yourfontname</item> 
Run Code Online (Sandbox Code Playgroud)

在你的 styles.xml

如果您愿意,也可以从Android Studio下载自定义字体.所有这些都可以在上面的视频中找到详细信息.


小智 6

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>
Run Code Online (Sandbox Code Playgroud)
  1. 在上面的xml文件中。仅使用应用程序来使用支持库。否则,如果您的应用程序的API级别为26+,则可以使用android
  2. 现在转到您的styles.xml并将其放在主样式的下面。
    <item name="android:fontFamily">@font/opensans</item>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重要提示:仅在使用支持库时,才使用AppCompatActivity
  4. 或使用以下方式以编程方式设置字体

    view.setTypeface(ResourcesCompat.getFont(context, R.font.opensans));
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

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

在此输入图像描述

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  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;
                }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    因为字体应该为每个活动单独设置,所以我更喜欢为其编写一个类以获得更干净的代码。

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

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

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


Naf*_*shi 5

这就是我将字体 ttf 应用到整个应用程序的方式

1、在res目录下创建一个名为font的目录

2.将字体 ttf 例如 varela.ttf 复制到该字体目录中

3.检查AndroidManifest.xml中的主题

    <application
        android:theme="@style/Theme.MyAppTheme">
        <activity
            ......
        </activity>
    </application>
Run Code Online (Sandbox Code Playgroud)

4.转到values目录中的themes.xml,并在AndroidManifest.xml中引用的基本主题样式中添加带有项目标签的字体

    <resources xmlns:tools="http://schemas.android.com/tools">
        <!-- Base application theme. -->
        <style name="Theme.MyAppTheme"
          parent="Theme.MaterialComponents.DayNight.DarkActionBar">
          <item name="android:fontFamily">@font/varela</item>
        </style>
    </resources>
Run Code Online (Sandbox Code Playgroud)