web-dev-qa-db-ja.com

TextViewのフォントを変更するにはどうすればいいですか?

TextViewのフォントを変更するにはどうすればいいですか?デフォルトではArialと表示されていますか?それをHelveticaに変更するにはどうすればいいですか?

277
Praveen

まず、デフォルトはArialではありません。デフォルトはDroid Sansです。

次に、別の組み込みフォントに変更するには、レイアウトXMLではAndroid:typefaceを、JavaではsetTypeface()を使用します。

第三に、AndroidにはHelveticaフォントがありません。組み込みの選択肢は、Droid Sans(sans)、Droid Sans Mono(monospace)、およびDroid Serif(serif)です。独自のフォントをアプリケーションにバンドルしてsetTypeface()経由で使用することはできますが、フォントファイルは大きく、場合によってはライセンス契約が必要となることに注意してください(たとえば、 Helvetica、Linotypeフォント )。

_編集_

Androidのデザイン言語は、スケール、スペース、リズム、基本的なグリッドとの位置合わせなど、伝統的な活字印刷ツールに依存しています。これらのツールを正しく展開することは、ユーザーが情報の画面をすばやく理解するのに役立ちます。このようなタイポグラフィの使用をサポートするために、Ice cream sandwichはRobotoという名前の新しいタイプファミリを導入しました。これは、特にUIと高解像度の画面の要件に合わせて作成されたものです。

現在のTextViewフレームワークは、各ウェイトのイタリックスタイルと共に、Robotoを細くて軽くて規則的で太字のウェイトで提供します。このフレームワークでは、各ウェイトのイタリックスタイルとともに、通常の太字のウェイトでRoboto Condensedバリアントも提供しています。

ICSの後、AndroidはRobotoフォントスタイルを含みます、続きを読む Roboto

編集2

Support Library 26の出現により、Androidはデフォルトでカスタムフォントをサポートするようになりました。新しいフォントを res/fonts に挿入することができます。これは個別にXMLまたはプログラムでTextViewに設定できます。アプリケーション全体のデフォルトフォントは、styles.xmlを定義することでも変更できます。Android開発者向けドキュメントにはこれに関する明確なガイドがあります ここ

337
CommonsWare

まず必要なフォントの.ttfファイルをダウンロードします(arial.ttf)。それをassetsフォルダーに置きます。 (アセットフォルダ内に fonts という名前の新しいフォルダを作成し、その中に配置します。)次のコードを使用して、フォントをTextViewに適用します。

Typeface type = Typeface.createFromAsset(getAssets(),"fonts/arial.ttf"); 
textView.setTypeface(type);
252
HjK
Typeface tf = Typeface.createFromAsset(getAssets(),
        "fonts/DroidSansFallback.ttf");
TextView tv = (TextView) findViewById(R.id.CustomFontText);
tv.setTypeface(tf);
50
Android Girl

あなたは static class を作成したいかもしれません - /すべてのフォントを含みます。そうすれば、フォントを複数回作成することがなくなり、 performance に悪影響が及ぶ可能性があります。 " assets "フォルダの下に " fonts "という サブフォルダ を作成してください。

次のようにしてください。

public class CustomFontsLoader {

public static final int FONT_NAME_1 =   0;
public static final int FONT_NAME_2 =   1;
public static final int FONT_NAME_3 =   2;

private static final int NUM_OF_CUSTOM_FONTS = 3;

private static boolean fontsLoaded = false;

private static Typeface[] fonts = new Typeface[3];

private static String[] fontPath = {
    "fonts/FONT_NAME_1.ttf",
    "fonts/FONT_NAME_2.ttf",
    "fonts/FONT_NAME_3.ttf"
};


/**
 * Returns a loaded custom font based on it's identifier. 
 * 
 * @param context - the current context
 * @param fontIdentifier = the identifier of the requested font
 * 
 * @return Typeface object of the requested font.
 */
public static Typeface getTypeface(Context context, int fontIdentifier) {
    if (!fontsLoaded) {
        loadFonts(context);
    }
    return fonts[fontIdentifier];
}


private static void loadFonts(Context context) {
    for (int i = 0; i < NUM_OF_CUSTOM_FONTS; i++) {
        fonts[i] = Typeface.createFromAsset(context.getAssets(), fontPath[i]);
    }
    fontsLoaded = true;

}
}

このように、あなたはあなたのアプリケーションのどこからでもフォントを取得することができます。

32
Daniel L.

ベストプラクティス

TextViewPlus.Java:

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface typeface = null;
        try {
            typeface = Typeface.createFromAsset(ctx.getAssets(), asset);
        } catch (Exception e) {
            Log.e(TAG, "Unable to load typeface: "+e.getMessage());
            return false;
        }

        setTypeface(typeface);
        return true;
    }
}

attrs.xml: (配置場所 res/values

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

使い方:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:foo="http://schemas.Android.com/apk/res-auto"
    Android:orientation="vertical" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">

    <com.mypackage.TextViewPlus
        Android:id="@+id/textViewPlus1"
        Android:layout_height="match_parent"
        Android:layout_width="match_parent"
        Android:text="@string/showingOffTheNewTypeface"
        foo:customFont="my_font_name_regular.otf">
    </com.mypackage.TextViewPlus>
</LinearLayout>

これがお役に立てば幸いです。

19
Hiren Patel

上記の答えは正しいです。そのコードを使用している場合は、必ず "assets"フォルダーの下に "fonts"というサブフォルダーを作成してください。

17

フォント作成を統合するもう1つの方法...

public class Font {
  public static final Font  PROXIMA_NOVA    = new Font("ProximaNovaRegular.otf");
  public static final Font  FRANKLIN_GOTHIC = new Font("FranklinGothicURWBoo.ttf");
  private final String      assetName;
  private volatile Typeface typeface;

  private Font(String assetName) {
    this.assetName = assetName;
  }

  public void apply(Context context, TextView textView) {
    if (typeface == null) {
      synchronized (this) {
        if (typeface == null) {
          typeface = Typeface.createFromAsset(context.getAssets(), assetName);
        }
      }
    }
    textView.setTypeface(typeface);
  }
}

そして、あなたの活動に使用するために...

myTextView = (TextView) findViewById(R.id.myTextView);
Font.PROXIMA_NOVA.apply(this, myTextView);

ちなみに、この二重チェックされたvolatileフィールドを使用したロッキングイディオムは、Java 1.5以降で使用されているメモリモデルでのみ正しく機能します。

14
Chris Aitchison

ベストプラクティスはAndroid Support Libraryバージョン26.0.0以上を使用することです。

ステップ1:フォントファイルを追加する

  1. resフォルダに新しいフォントリソース辞書を作成します
  2. フォントファイルを追加する(.ttf.orf

たとえば、フォントファイルがhelvetica_neue.ttfになると、R.font.helvetica_neueが生成されます。

ステップ2:フォントファミリを作成する

  1. fontフォルダに新しいリソースファイルを追加します
  2. 各フォントファイル、スタイル、および太さ属性を要素で囲みます。

例えば:

<?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/helvetica_neue" />
</font-family>

ステップ3:それを使う

XMLレイアウトの場合:

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

あるいはスタイルにフォントを追加します。

<style name="customfontstyle" parent="@Android:style/TextAppearance.Small">
    <item name="Android:fontFamily">@font/lobster</item>
</style>

より多くの例のためにあなたはドキュメンテーションに従うことができます:

フォントを使った作業

12

それは少し古いですが、私はクラスCustomFontLoaderを少し改良しました、そしてそれが役に立つことができるようにそれを共有したかったです。このコードで新しいクラスを作成するだけです。

 import Android.content.Context;
 import Android.graphics.Typeface;

public enum FontLoader {

ARIAL("arial"),
TIMES("times"),
VERDANA("verdana"),
TREBUCHET("trbuchet"),
GEORGIA("georgia"),
GENEVA("geneva"),
SANS("sans"),
COURIER("courier"),
TAHOMA("tahoma"),
LUCIDA("lucida");   


private final String name;
private Typeface typeFace;


private FontLoader(final String name) {
    this.name = name;

    typeFace=null;  
}

public static Typeface getTypeFace(Context context,String name){
    try {
        FontLoader item=FontLoader.valueOf(name.toUpperCase(Locale.getDefault()));
        if(item.typeFace==null){                
            item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");                 
        }           
        return item.typeFace;
    } catch (Exception e) {         
        return null;
    }                   
}
public static Typeface getTypeFace(Context context,int id){
    FontLoader myArray[]= FontLoader.values();
    if(!(id<myArray.length)){           
        return null;
    } 
    try {
        if(myArray[id].typeFace==null){     
            myArray[id].typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+myArray[id].name+".ttf");                       
        }       
        return myArray[id].typeFace;    
    }catch (Exception e) {          
        return null;
    }   

}

public static Typeface getTypeFaceByName(Context context,String name){      
    for(FontLoader item: FontLoader.values()){              
        if(name.equalsIgnoreCase(item.name)){
            if(item.typeFace==null){
                try{
                    item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
                }catch (Exception e) {          
                    return null;
                }   
            }
            return item.typeFace;
        }               
    }
    return null;
}   

public static void loadAllFonts(Context context){       
    for(FontLoader item: FontLoader.values()){              
        if(item.typeFace==null){
            try{
                item.typeFace=Typeface.createFromAsset(context.getAssets(), "fonts/"+item.name+".ttf");     
            }catch (Exception e) {
                item.typeFace=null;
            }   
        }                
    }       
}   
}

それからあなたのtextviewでこのコードを使ってください:

 Typeface typeFace=FontLoader.getTypeFace(context,"arial");  
 if(typeFace!=null) myTextView.setTypeface(typeFace);
7
Alan

私はついにこれに対する非常に簡単な解決策を得ました。

  1. これらのサポートライブラリを app level gradleで使用してください

    compile 'com.Android.support:appcompat-v7:26.0.2'
    compile 'com.Android.support:support-v4:26.0.2'
    
  2. それから res フォルダの中に "font" という名前のディレクトリを作成します。

  3. そのフォントディレクトリにフォント(ttf)ファイルを置く、命名規則を覚えておいてください。
  4. その後は、 xml からこのフォントを参照してください。

            <Button
            Android:id="@+id/btn_choose_employee"
            Android:layout_width="140dp"
            Android:layout_height="40dp"
            Android:layout_centerInParent="true"
            Android:background="@drawable/rounded_red_btn"
            Android:onClick="btnEmployeeClickedAction"
            Android:text="@string/searching_jobs"
            Android:textAllCaps="false"
            Android:textColor="@color/white"
            Android:fontFamily="@font/times_new_roman_test"
            />
    

この例では、 times_new_roman_test がそのフォントディレクトリのフォントttfファイルです。

import Java.lang.ref.WeakReference;
import Java.util.HashMap;

import Android.content.Context;
import Android.graphics.Typeface;

public class FontsManager {

    private static FontsManager instance;

    private static HashMap<String, WeakReference<Typeface>> typefaces = new HashMap<String, WeakReference<Typeface>>();

    private static Context context;

    private FontsManager(final Context ctx) {
        if (context == null) {
            context = ctx;
        }
    }

    public static FontsManager getInstance(final Context appContext) {
        if (instance == null) {
            instance = new FontsManager(appContext);
        }
        return instance;
    }

    public static FontsManager getInstance() {
        if (instance == null) {
            throw new RuntimeException(
                    "Call getInstance(Context context) at least once to init the singleton properly");
        }
        return instance;
    }

    public Typeface getFont(final String assetName) {
        final WeakReference<Typeface> tfReference = typefaces.get(assetName);
        if (tfReference == null || tfReference.get() == null) {
            final Typeface tf = Typeface.createFromAsset(context.getResources().getAssets(),
                    assetName);
            typefaces.put(assetName, new WeakReference<Typeface>(tf));
            return tf;
        }
        return tfReference.get();
    }

}

このようにして、TextViewから継承し、そのコンストラクタでsetTypefaceを呼び出すViewを作成できます。

4
Charlie-Blake
  1. fontTextView.Javaクラスを追加します。


public class FontTextView extends TextView {
    String fonts[] = {"HelveticaNeue.ttf", "HelveticaNeueLight.ttf", "motschcc.ttf", "symbol.ttf"};

    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (!isInEditMode()) {
            init(attrs);
        }

    }

    public FontTextView(Context context) {
        super(context);
        if (!isInEditMode()) {
            init(null);
        }
    }

    private void init(AttributeSet attrs) {
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.FontTextView);
            if (a.getString(R.styleable.FontTextView_font_type) != null) {
                String fontName = fonts[Integer.valueOf(a.getString(R.styleable.FontTextView_font_type))];

                if (fontName != null) {
                    Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "font/" + fontName);
                    setTypeface(myTypeface);
                }
                a.recycle();
            }
        }
    }
}


  1. アセットライブラリフォントに追加する
    enter image description here


  1. attrs.xmlに追加します。数字は配列クラスの順序になっている必要があります。

    <declare-styleable name="FontTextView">
    <attr name="font_type" format="enum">
        <enum name="HelveticaNeue" value="0"/>
        <enum name="HelveticaNeueLight" value="1"/>
        <enum name="motschcc" value="2"/>
        <enum name="symbol" value="3"/>
    </attr>
    


  1. リストからフォントを選択してください
    enter image description here
2
david

資産からフォントを取得し、すべての子に設定する

public static 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(Typeface.createFromAsset(context.getAssets(),"DroidNaskh.ttf"));// "BKOODB.TTF"));
        }
    } catch (Exception e) {
 }
 } 
2
Akbar Rezaee

もう少し単純なものがあるかもしれません:

public class Fonts {
  public static HashSet<String,Typeface> fonts = new HashSet<>();

  public static Typeface get(Context context, String file) {
    if (! fonts.contains(file)) {
      synchronized (this) {
        Typeface typeface = Typeface.createFromAsset(context.getAssets(), name);
        fonts.put(name, typeface);
      }
    }
    return fonts.get(file);
  }
}

// Usage
Typeface myFont = Fonts.get("arial.ttf");

(このコードはテストされていませんが、一般的にこの方法でうまくいくはずです)

0
trans

AndroidはRobotoフォントを使用しています。これは、非常に見栄えの良いフォントで、いくつかの異なる重み(通常、ライト、シン、コンデンス)があり、高密度スクリーンでは非常によく似ています。

Robotoフォントを確認するには、以下のリンクを確認してください。

xmlレイアウトでRobotoを使う方法

あなたの質問に戻って、 あなたのアプリのTextView/Buttonのすべてのフォントを変更したい場合 Roboto-light fontを使用するようにstyles.xmlに以下のコードを追加してみてください。 :

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    ......
    <item name="Android:buttonStyle">@style/MyButton</item>
    <item name="Android:textViewStyle">@style/MyTextView</item>
</style>

<style name="MyButton" parent="@style/Widget.AppCompat.Button">
    <item name="Android:textAllCaps">false</item>
    <item name="Android:fontFamily">sans-serif-light</item>
</style>

<style name="MyTextView" parent="@style/TextAppearance.AppCompat">
    <item name="Android:fontFamily">sans-serif-light</item>
</style>

そして、あなたのAndroidManifest.xmlで 'AppTheme'を使うことを忘れないでください

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:roundIcon="@mipmap/ic_launcher_round"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
    ......
</application>
0
Chandler

あなたのフォントがres/asset/fonts/Helvetica.ttfの中に格納されているときは、以下を使用してください。

Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/Helvetica.ttf"); 
txt.setTypeface(tf);

あるいは、フォントファイルがres/font/helvetica.ttf内に保存されている場合は、次のようにします。

Typeface tf = ResourcesCompat.getFont(this,R.font.helvetica);
txt.setTypeface(tf);
0
Pankaj Lilan