Androidでアプリケーション全体のカスタムフォントを設定するにはどうすればよいですか?


83

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年

私の答えのいくつかのリンクをチェックアウトしてください、役に立つようです、私の最初のリンクが本当に良いもう1つのこと、ありがとう
Androider 2015年

回答:


50

クラスを書く

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メソッドが呼び出され、フォントが設定されます。

更新 フォントファイルをassets / 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>

お役に立てれば


テストしているAndroidOSのバージョンを教えてください。私はロリポップで私たちが特定のより多くの週を作る必要があることを観察しました
Nitin Mesta

Lollipopおよび以前のAndroidバージョンのソリューションについては、次のリンクを確認してください:(stackoverflow.com/a/36206275/2268466
blueware 2017

トーストメッセージ、アラートダイアログのすべてのアプリフォントを変更します。これでカスタムフォントを使用したくない
Adil

1
多くのメーカーは、ユーザーが設定からシステム全体のフォントを変更することを許可しています。その変更は、プログラムで設定したフォントタイプにも上書きされますか?
ブロ

複数のフォントを設定するのはどうですか?
GauravMandlik20年

82

編集

uk.co.chrisjenx:calligraphy最新のAndroidバージョンの代替ライブラリは 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()
                );
            }
        } 

アセット/「新しいディレクトリ」「フォント」(以下を参照)で作成する必要があるため、そのコードでは「フォントパス」は「fonts /SourceSansPro-Regular.ttf」である必要があります。(「/ fonts ..」や「assets ..」ではなく、単に「fonts ...」です)

そして、アクティビティクラスでこのメソッドをonCreateの前に置きます。

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

そして最後にマニフェストファイルは次のようになります。

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

そしてそれはあなたのフォントに全体の活動を変えるでしょう!シンプルでクリーン!

[アセット]で、[新しいディレクトリ]を右クリックし、「フォント」と呼びます。ファインダーに.ttfフォントファイルを入れます。

ここに画像の説明を入力してください

また、attrs.xmlに2行以下を追加することを忘れないでください。attrs.xmlファイルがない場合は、values.xmlに新しいファイルを作成してください。

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

私はttfを使用していますが、.otfも機能し、アセットフォルダーに配置するのに最適な場所であると確信しています。
Rajesh Nasit 2017

これを拡張アプリケーションクラスに入れますCalligraphyConfig.initDefault(new CalligraphyConfig.Builder()。setDefaultFontPath( "fonts / GOTHAM-MEDIUM.ttf")。setFontAttrId(R.attr.fontPath).build()); また、values.xmlに2行以下を追加することを忘れないでください<attr format = "string" name = "fontPath" /> <item name = "calligraphy_tag_id" type = "id" />
Rajesh Nasit 2017

こんにちは@rajesh!あなたは「編集」をクリックして、それをあなたの素晴らしい答えに追加するべきです!あなたは正しいです、それは.ttfファイルでなければなりません、ごめんなさい。
Fattie 2017

1
フラグメントは可能な限り最大限に使用できます。そのため、活動の数が減ります。
Rajesh Nasit 2017

1
@Pawanが1つのステップを実行します-attachBaseContext(..)実装される単純な基本クラスを定義し、次にすべてのプロジェクトアクティビティクラス(カスタムフォントが必要な場合)がその基本クラスを拡張します
Gene Bo

65

私がしたのは:

1:「新しいリソースディレクトリ」をRESフォルダに追加し、指定されたドロップダウンから「フォント」としてリソースタイプを選択し、新しいディレクトリに「フォント」という名前を付けて保存しました。 新しいリソースディレクトリ

2:作成したFONTフォルダに「custom_font.ttf」を追加しました。

3:STYLES.XMLのアプリケーションベーステーマにカスタムフォントを追加しました

STYLES.XML

完了。


4
また、フォントファミリーを作成する必要があります。その後、それは私のために働いた。詳細はこちら:developer.android.com/guide/topics/ui/look-and-feel/...
keybee

フォントファミリーを作成しなくても機能しました。ただし、Gradleバージョン> 3を使用し、ツールをビルドして、ライブラリを27に設定する必要がありました> @keybee
Numanqmr

フォントファミリーがなくても、私にとっては
Julian Alberto

プログラムで変更する方法を知っていますか?
majov

@majovは#Rajeeshによる上記の答えを確認してください。それはあなたを助けるはずです!
Numanqmr 2018

12

set / 2017公開されているAndroidDeveloperの公式YouTubeチャンネルとして、AndroidSDKで今すぐ実行できます

APIレベル26(Android 8 Oreo)以上が必要です。

フォントファイルをres/fontフォルダに入れてTextViewandroid:fontFamily属性を持つ特定のファイルが必要な場合に備えて、フォントファイルを参照する必要があります。

アプリ全体にベースフォントが必要な場合は、

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

あなたの中で styles.xml

必要に応じて、AndroidStudioや外出先からカスタムフォントをダウンロードできます。これらすべては、上のビデオの詳細で見つけることができます。


このオプションは、API26以降用です。16歳以上ではない
パーフェクトスクエア

API 23 +の修正はどうですか?
RajuyourPepe19年

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:typefaceあなたにstyles.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することで、アプリケーションのApplicationクラスのサブクラスを作成するだけです。したがって、接続する必要はありません。
スハス2015年

使用されたことがないというのは何ですか?
スハス2015年

同じSO投稿で提案されているように、アプリのファイル<item name="android:typeface">default</item><style name="AppTheme" parent="AppBaseTheme">にも行を追加res -> values -> styles.xmlしましたか?
スハス2015年

はい、それも機能しません。それは私が私の編集に入れたものです... :(
Sonhja 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");
    }
}

またはもちろん、同じフォントファイルを使用している場合は、これを改善して1回だけロードすることができます。

ただし、「MONOSPACE」などの1つをオーバーライドしてから、そのフォント書体アプリケーション全体を強制するスタイルを設定する傾向があります。

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

2
  1. 最初に、プロジェクトリソースを右クリックして名前を付けresnewオプションからフォームを選択Android Resource Directoryして[ OK]を押すと、フォントディレクトリが作成されてフォントが配置されます。fontResource 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>
    
  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の前にclassメソッドを呼び出します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上記のようなすべてのアクティビティに渡すことを忘れないでください。


1

メインフォルダにアセットフォルダを作成し、その中にフォントフォルダを追加します。.ttfファイルをfontsフォルダーに追加します。

アプリのテーマに以下を追加します。

 <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);
        }
    }
}

アプリケーションクラスまたはランチャーアクティビティで呼び出します

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

0

まず、カスタマイズするビューをオーバーライドする新しいクラスを作成します。(たとえば、カスタム書体のボタンが必要ですか?拡張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);
    }
}

ここで、お持ちでない場合は、の下res/values/attrs.xmlに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属性にプレフィックスをです。

最後にもう1つ、これをスタイル(res/values/styles.xml)で使用する場合は、行を追加しないでくださいxmlns:custom。プレフィックスなしで属性の名前を参照するだけです。

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

0

私もフォントのオーバーライドを試しましたが、最終的には信頼できる解決策ではありません。悲しいことに、フォントのオーバーライドにはそれ以上の時間がかかります。カスタムフォントのAndroidOがリリースされるのを待つか、サードパーティのライブラリを使用できます。

私が遭遇した最後の解決策は、このライブラリCaligraphyでした。これは、開始が簡単で、必要な数のフォントを使用できるようにしました。ソースコードをチェックしていると、フォントをオーバーライドするだけでは機能しない理由がわかりました。使用する予定がない場合でも、一度読んでおくことをお勧めします。

幸運を


うん..多分。とにかく、この問題の背後にある理由を見つけた場合はお知らせください。本当に感謝します。基礎となるコードを読んでも解決策が見つかりませんでした。
Keivan Esbati 2017

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を任意のアクティビティに拡張します。または、を使用している場合は、フラグメント用に同じクラスを作成できます。

注:-ビューの一部を異なる書体に設定する場合は、プログラムで次のように設定する必要があります

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

第一歩

フォントファイルを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")
        }
    }
}

ステップ2 次にあなたのonCreate

val typefaceUtil = TypefaceUtil()

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

ステップ3

これをあなたのスタイルに追加してください

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

0

アプリケーションと作業で表示するには、フォント名を小文字にする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.