TextView
のフォントを変更するにはどうすればいいですか?デフォルトではArialと表示されていますか?それをHelvetica
に変更するにはどうすればいいですか?
まず、デフォルトは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開発者向けドキュメントにはこれに関する明確なガイドがあります ここ
まず必要なフォントの.ttf
ファイルをダウンロードします(arial.ttf
)。それをassets
フォルダーに置きます。 (アセットフォルダ内に fonts という名前の新しいフォルダを作成し、その中に配置します。)次のコードを使用して、フォントをTextView
に適用します。
Typeface type = Typeface.createFromAsset(getAssets(),"fonts/arial.ttf");
textView.setTypeface(type);
Typeface tf = Typeface.createFromAsset(getAssets(),
"fonts/DroidSansFallback.ttf");
TextView tv = (TextView) findViewById(R.id.CustomFontText);
tv.setTypeface(tf);
あなたは 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;
}
}
このように、あなたはあなたのアプリケーションのどこからでもフォントを取得することができます。
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>
これがお役に立てば幸いです。
上記の答えは正しいです。そのコードを使用している場合は、必ず "assets"フォルダーの下に "fonts"というサブフォルダーを作成してください。
フォント作成を統合するもう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以降で使用されているメモリモデルでのみ正しく機能します。
ステップ1:フォントファイルを追加する
たとえば、フォントファイルがhelvetica_neue.ttfになると、R.font.helvetica_neueが生成されます。
ステップ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>
より多くの例のためにあなたはドキュメンテーションに従うことができます:
それは少し古いですが、私はクラス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);
私はついにこれに対する非常に簡単な解決策を得ました。
これらのサポートライブラリを app level gradleで使用してください 、
compile 'com.Android.support:appcompat-v7:26.0.2'
compile 'com.Android.support:support-v4:26.0.2'
それから res フォルダの中に "font" という名前のディレクトリを作成します。
その後は、 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を作成できます。
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();
}
}
}
}
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>
資産からフォントを取得し、すべての子に設定する
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) {
}
}
もう少し単純なものがあるかもしれません:
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");
(このコードはテストされていませんが、一般的にこの方法でうまくいくはずです)
AndroidはRobotoフォントを使用しています。これは、非常に見栄えの良いフォントで、いくつかの異なる重み(通常、ライト、シン、コンデンス)があり、高密度スクリーンでは非常によく似ています。
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>
あなたのフォントが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);