web-dev-qa-db-ja.com

Android - カスタムフォントの使用

カスタムフォントをTextViewに適用しましたが、書体は変更されません。

これが私のコードです:

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    myTextView.setTypeface(myTypeface);

誰かが私をこの問題から解放してもらえますか?

259
RATTLESNAKE

Mobiletuts +では、Androidのテキストフォーマットに関する非常に優れたチュートリアルがあります。 クイックヒント:Androidフォントのカスタマイズ

編集:今それを自分でテストしました。これが解決策です。 fontsというサブフォルダーを使用できますが、assetsフォルダーではなくresフォルダーに入れる必要があります。そう

資産/フォント

また、フォントファイル自体の末尾のフォントの末尾がすべて小文字であることを確認してください。つまり、myFont.TTFではなくmyfont.ttfにする必要があります。このように小文字にする必要があります

226

このスレッドで説明されている解決策のほとんどを試した後、私は誤ってCalligraphy( https://github.com/chrisjenx/Calligraphy )を見つけました - Christopher Jenkinsによるライブラリ。アプリ。ここで提案されたアプローチと比較した彼のlibの利点は以下のとおりです。

  1. あなた自身の上書きされたTextViewコンポーネントを導入する必要はありません、あなたは組み込みのTextViewを使います
  2. gradleを使ってライブラリを簡単に含めることができます
  3. ライブラリはフォントの選択を制限しません。あなただけの資産ディレクトリにあなたの好みのものを追加
  4. カスタムテキストビューを取得するだけでなく、他のテキストベースのAndroidコンポーネントもすべてカスタムフォントを使用して表示されます。
55
javaxian

良い答えがすでにあることを私は知っていますが、これは完全に機能する実装です。

これがカスタムテキストビューです。

package com.mycompany.myapp.widget;

/**
 * Text view with a custom font.
 * <p/>
 * In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
 * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
 * {@code xmlns:customAttrs="http://schemas.Android.com/apk/res-auto"} in the header.
 */
public class CustomFontTextView extends TextView {

    private static final String sScheme =
            "http://schemas.Android.com/apk/res-auto";
    private static final String sAttribute = "customFont";

    static enum CustomFont {
        ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
        ROBOTO_LIGHT("fonts/Roboto-Light.ttf");

        private final String fileName;

        CustomFont(String fileName) {
            this.fileName = fileName;
        }

        static CustomFont fromString(String fontName) {
            return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
        }

        public Typeface asTypeface(Context context) {
            return Typeface.createFromAsset(context.getAssets(), fileName);
        }
    }

    public CustomFontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

        if (isInEditMode()) {
            return;
        } else {
            final String fontName = attrs.getAttributeValue(sScheme, sAttribute);

            if (fontName == null) {
                throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
            } else {
                final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
                setTypeface(customTypeface);
            }
        }
    }
}

これがカスタム属性です。これはあなたのres/attrs.xmlファイルに行きます:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomFontTextView">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

そして、これがあなたがそれを使う方法です。それをラップしてcustomAttr宣言を示すために相対的なレイアウトを使いますが、それは明らかにあなたがすでに持っているどんなレイアウトでもありえます。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:customAttrs="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <com.mycompany.myapp.widget.CustomFontTextView
         Android:layout_width="wrap_content"
         Android:layout_height="wrap_content"
         Android:text="foobar"
         customAttrs:customFont="roboto_thin" />

</RelativeLayout>
32
espinchi

私は以前にこれを使用しました。私たちの実装の唯一の違いは、私がアセットにサブフォルダを使っていなかったことです。しかし、それが何かを変えるかどうかは定かではありません。

14
benvd

フォントを正しい場所に配置し、フォントファイル自体にエラーがなければ、コードはそのように動作するはずです(RATTLESNAKE)。

ただし、次のようにレイアウトxmlにフォントを定義できれば、はるかに簡単になります。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <!-- This text view is styled with the app theme -->
    <com.innovattic.font.FontTextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="This uses my font in bold italic style" />

    <!-- This text view is styled here and overrides the app theme -->
    <com.innovattic.font.FontTextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        app:flFont="anotherFont"
        Android:textStyle="normal"
        Android:text="This uses another font in normal style" />

    <!-- This text view is styled with a style and overrides the app theme -->
    <com.innovattic.font.FontTextView
        style="@style/StylishFont"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="This also uses another font in normal style" />

</LinearLayout>

付随するres/values/styles.xmlと共に:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:tools="http://schemas.Android.com/tools">

    <!-- Application theme -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="AppTheme" parent="Android:Theme.Holo.Light.DarkActionBar">
        <item name="Android:textViewStyle">@style/MyTextViewStyle</item>
    </style>

    <!-- Style to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextViewStyle" parent="@Android:style/Widget.Holo.Light.TextView">
        <item name="Android:textAppearance">@style/MyTextAppearance</item>
    </style>

    <!-- Text appearance to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextAppearance" parent="@Android:style/TextAppearance.Holo">
        <!-- Alternatively, reference this font with the name "aspergit" -->
        <!-- Note that only our own TextView's will use the font attribute -->
        <item name="flFont">someFont</item>
        <item name="Android:textStyle">bold|italic</item>
    </style>

    <!-- Alternative style, maybe for some other widget -->
    <style name="StylishFont">
        <item name="flFont">anotherFont</item>
        <item name="Android:textStyle">normal</item>
    </style>

</resources>

私は特にこの目的のためにいくつかのツールを作成しました。 GitHubの このプロジェクト を参照するか、これを見てください ブログ記事 これですべてのことを説明できます。

14
Jelle Fresen

Androidのカスタムフォントの場合は、アセットフォルダ内に「fonts」という名前のフォルダを作成し、そこに目的のfonts.ttfファイルまたは.otfファイルを配置します。

UIBaseFragmentを拡張した場合

Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);

それ以外の場合はActivityを拡張します。

Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);
12
Faakhir

それをするための最良の方法は、Android Oのプレビューリリースからは、この方法です:

Android studio-2.4以上がある場合にのみ機能します

  1. resフォルダを右クリックし、新規> Androidリソースディレクトリに移動します。 。新しい
    リソースディレクトリウィンドウが表示されます。
  2. [リソースの種類]ボックスの一覧で[フォント]を選択し、[OK]をクリックします。
  3. フォントファイルをフォントフォルダーに追加します。以下のフォルダー構造はR.font.dancing_scriptR.font.la_laR.font.ba_baを生成します。
  4. フォントファイルをダブルクリックして、ファイルのフォントをエディタでプレビューします。

次にフォントファミリーを作成します。

  1. フォントフォルダを右クリックして、新規>フォントリソースファイルに移動します。 [新しいリソースファイル]ウィンドウが表示されます。
  2. ファイル名を入力し、[OK]をクリックします。新しいフォントリソースXMLがエディタに表示されます。
  3. 各フォントファイル、スタイル、および太さ属性をフォントタグ要素で囲みます。次のXMLは、フォントリソースXMLにフォント関連の属性を追加する方法を示しています。

TextViewにフォントを追加する:

   <TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:fontFamily="@font/hey_fontfamily"/>

ドキュメントから

フォントの操作

すべての手順は正しいです。

12
jeevan s

PixlUIは https://github.com/neopixl/PixlUI で使用できます。

それらの.jarをインポートしてXMLで使用する

 <com.neopixl.pixlui.components.textview.TextView
    Android:id="@+id/textView1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="@string/hello_world"
    pixlui:typeface="GearedSlab.ttf" />
7
guest2343sdfdfs

私はSOについて提示されたすべての解決策に満足していなかったので、私は私に思い付きました。これはタグを使ったちょっとしたトリックに基づいています(つまり、コードにタグを使用することはできません)。ここにフォントパスを置きます。そのため、ビューを定義するときには、次のいずれかを実行できます。

<TextView
        Android:id="@+id/textViewHello1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Hello World 1"
        Android:tag="fonts/Oswald-Regular.ttf"/>

またはこれ:

<TextView
        Android:id="@+id/textViewHello2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Hello World 2"
        style="@style/OswaldTextAppearance"/>

<style name="OswaldTextAppearance">
        <item name="Android:tag">fonts/Oswald-Regular.ttf</item>
        <item name="Android:textColor">#000000</item>
</style>

これで、ビューに明示的にアクセス/設定することができます。

TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");

または単に次のようにしてすべてを設定します。

TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)

そして、あなたが求めるマジッククラスは何ですか?アクティビティとフラグメントの両方のためのヘルパーメソッドを使って、他のSO投稿から大部分接着されました:

import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Typeface;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;

import Java.util.HashMap;
import Java.util.Map;

public class TextViewHelper {
    private static final Map<String, Typeface> mFontCache = new HashMap<>();

    private static Typeface getTypeface(Context context, String fontPath) {
        Typeface typeface;
        if (mFontCache.containsKey(fontPath)) {
            typeface = mFontCache.get(fontPath);
        } else {
            typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
            mFontCache.put(fontPath, typeface);
        }
        return typeface;
    }

    public static void setupTextViews(Context context, ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setupTextViews(context, (ViewGroup) child);
            } else {
                if (child != null) {
                    TextViewHelper.setupTextView(context, child);
                }
            }
        }
    }

    public static void setupTextView(Context context, View view) {
        if (view instanceof TextView) {
            if (view.getTag() != null) // also inherited from TextView's style
            {
                TextView textView = (TextView) view;
                String fontPath = (String) textView.getTag();
                Typeface typeface = getTypeface(context, fontPath);
                if (typeface != null) {
                    textView.setTypeface(typeface);
                }
            }
        }
    }

    public static TextView setupTextView(View rootView, int id) {
        TextView textView = (TextView) rootView.findViewById(id);
        setupTextView(rootView.getContext().getApplicationContext(), textView);
        return textView;
    }

    public static TextView setupTextView(Activity activity, int id) {
        TextView textView = (TextView) activity.findViewById(id);
        setupTextView(activity.getApplicationContext(), textView);
        return textView;
    }
}
4
Miro Kropacek

残念ながらこれに対する良い解決策はありません。

私は、カスタムTextViewの使用に関する多くの記事を見ましたが、フォントを実装できるのはテキストビューだけではなく、開発者にとってアクセスできない他のビューに隠されているテキストビューもあります。私も始めるつもりはありませんSpannable

次のような外部フォントユーティリティを使うことができます。

書道フォントツール

BUT作成時にアプリケーション内のすべてのビューをループし、このユーティリティでも一部のビューが表示されなくなる(ViewPagerは通常のフォントをレンダリングします)。廃止予定のプロパティを対象とする必要があるためクラッシュします。 Java's Reflectionを使っているので少し遅いです。

これを解決するのは本当にグーグル次第です。私たちはAndroidでより良いフォントサポートを必要としています。あなたがiOSからの解決策を見れば、彼らは文字通りから選択するために組み込まれた何百ものフォントを持っています。カスタムフォントが欲しいですか? TFFを入れるだけで使えます。

今のところ、今はGoogleが提供しているサービスに限られていました。

4
Oliver Dixon

アプリケーションでカスタムフォントを使用するAndroid 8.0ではdownloadable fontsで簡単になりました。プロジェクトフォルダのres/font/ folderに直接フォントを追加することができます。その際、フォントはAndroid Studioで自動的に使用可能になります。

Folder Under res with name font and type set to Font

今度はfontFamily属性をフォントのリストに設定するか、moreをクリックしてあなたの選んだフォントを選択してください。これはTextViewにtools:fontFamily="@font/your_font_file"行を追加します

これは自動的にいくつかのファイルを生成します。

1.valuesフォルダにfonts_certs.xmlを作成します。

2。Manifestでは次の行を追加します。

  <meta-data
            Android:name="preloaded_fonts"
            Android:resource="@array/preloaded_fonts" /> 

3。preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>
2
Dipali s.

上記のコードを必ずonCreate()after superへの呼び出しとsetContentView()への呼び出しに貼り付けてください。この細部が私をしばらくの間ハングアップさせ続けた。

2
Jaxon

あなたがネットワークからフォントをロードしたい、または簡単にそれをスタイルしたいならば、あなたは使うことができます:

https://github.com/shellum/fontView

例:

<!--Layout-->
<com.finalhack.fontview.FontView
        Android:id="@+id/someFontIcon"
        Android:layout_width="80dp"
        Android:layout_height="80dp" />

//Java:
fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);
1
Shellum

さて、7年後にはAndroid.supportライブラリ26 ++を使うことでアプリ全体のtextViewや簡単に望むものを変更することができます。

例えば:

あなたのフォントパッケージapp/src/res/fontを作成し、そこにあなたのフォントを移動してください。

enter image description here

そしてあなたのアプリのテーマではfontFamilyとして追加するだけです。

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   . . . ...
    <item name="Android:fontFamily">@font/demo</item>
</style>

textViewでのみ使用する例

<style name="fontTextView" parent="@Android:style/Widget.TextView">
    <item name="Android:fontFamily">monospace</item>
</style>

そしてあなたのメインテーマに加えてください:

<item name="Android:textViewStyle">@style/fontTextView</item>

現在それは8.1から4.1 APIジェリービーンに取り組んでいますそしてそれは広い範囲です。

1
user6490462

私は同じ問題を抱えていました、TTFは現れませんでした。フォントファイルを変更しましたが、同じコードで動作しています。

1

あなたはあなたのTextViewに様々なカスタムフォントを設定するためにeasy&simple EasyFonts 第三者ライブラリを使うことができます。このライブラリを使用すれば、フォントをダウンロードしてassets/fontsフォルダに追加することを心配する必要はありません。 Typefaceオブジェクト作成についても。

の代わりに

Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(myTypeface);

単に:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

このライブラリは以下のフォントも提供しています。

  • ロボト
  • ドロイドセリフ
  • ドロイドロボット
  • 自由
  • ファンライザー
  • Androidの国
  • グリーンアボカド
  • 認識
1
vsvankhede

アップデートの回答:Android 8.0(APIレベル26)では、Fonts in XMLという新しい機能が導入されました。 Android 4.1(APIレベル16)以降を実行しているデバイスではXMLのフォント機能を使用するだけで、サポートライブラリ26を使用します。

これを参照してください link


古い答え

フォントをカスタマイズする方法は2つあります。

!!! assets/fonts/iran_sans.ttfにある私のカスタムフォント



方法1:リフレクションTypeface.class ||| 最善の方法

クラス内でFontsOverride.setDefaultFont()を呼び出してApplicationを拡張します。このコードは、Toastsフォントであってもすべてのソフトウェアフォントを変更します。

AppController.Java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.Java

public class FontsOverride {

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

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



方法2:setTypefaceを使用する

特別な表示のためには単にフォントを変更するためにsetTypeface()を呼び出してください。

CTextView.Java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.Lollipop)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.Java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}
1
Rasoul Miri
  • プロジェクトを開き、左上のプロジェクトを選択します。
  • app - >src - >メイン
  • mainを右クリックして、ディレクトリ名を資産として作成します。
  • 右クリックして新規ディレクトリを作成し、それに名前を付けますフォント
  • あなたはのようなフリーフォントを見つける必要があります フリーフォント
  • それをあなたのTextviewに渡して、あなたのActivityクラスでそれを呼び出します
  • フォントをフォントフォルダ内にコピーします。
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

フォントの名前は正しくなければなりません

0
Sam

Androidが最も簡単にサポートされるようになりました。

Xmlでカスタムフォントを使う:

<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:fontFamily="@font/[your font resource]"/>

詳細を見る:

https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

0
mrtwo

はい、ダウンロード可能なフォントはとても簡単です。Dipali sが言っています。

これがあなたのやり方です….

  1. TextViewを配置してください。
  2. プロパティペインでfontFamilyドロップダウンを選択します。表示されていない場合は、の下でキャレットを探してください(>をクリックし、それをクリックしてtextAppearanceを展開します)。
  3. font-familyドロップダウンを展開します。
  4. 小さなリストで、more fontsが表示されるまで一番下までスクロールします
  5. これにより、Google Fontsから検索できるダイアログボックスが開きます。
  6. 上部の検索バーで好きなフォントを検索
  7. あなたのフォントを選択してください。
  8. 好きなフォントのスタイル(太字、標準、斜体など)を選択します。
  9. 右側のウィンドウで、Add font to projectというラジオボタンを選択します。
  10. OKをクリックしてください。今すぐあなたのTextViewはあなたが好きなフォントを持っています!

ボーナス:あなたが選択したフォントであなたのアプリケーションでテキストですべてをスタイルすることを望むならば、ちょうどあなたの<item name="Android:fontfamily">@font/fontnamehere</item>styles.xmlを加えてください

0
flash76

API 26以降でこれを行う正しい方法は、こちらの公式文書に記載されています。

https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

これには、ttfファイルをres/fontフォルダに配置し、フォントファミリファイルを作成することが含まれます。

0
Arunabh Das