如何更改TextView上的字体?

如何更改TextView的字体,默认情况下显示为Arial? 如何将其更改为Helvetica

首先,默认不是Arial。 默认是Droid Sans。

其次,要更改为不同的内置字体,请在布局XML中使用android:typeface或在Java中使用setTypeface()

第三,Android中没有Helvetica字体。 内置的选择是Droid Sans( sans ),Droid Sans Mono( monospace )和Droid Serif( serif )。 虽然您可以将自己的字体与您的应用程序捆绑在一起,并通过setTypeface()使用它们, setTypeface()记住字体文件很大,并且在某些情况下需要许可协议(例如Helvetica,一种Linotype字体 )。

编辑

Android设计语言依赖于传统的印刷工具,如规模,空间,节奏,以及与底层网格的对齐。 这些工具的成功部署对帮助用户快速理解信息屏幕至关重要。 为了支持这种排版,冰淇淋三明治推出了一个名为Roboto的新型家族,专门为UI和高分辨率屏幕的需求而创建。

目前的TextView框架提供了轻薄,轻巧,规则和大胆的重量,以及每个重量的斜体样式。 该框架还提供了规则和大胆的权重,以及每个重量的斜体风格的Roboto压缩变体。

ICS之后,android包含Roboto字体样式,阅读更多Roboto

首先下载你需要的字体的.ttf文件( arial.ttf )。 将其放置在assets文件夹(资产内的文件夹中创建新的文件夹命名字体,并把它放在里面)。 如果txtyour是要应用字体的textviews ,请使用以下代码片段,

  Typeface type = Typeface.createFromAsset(getAssets(),"fonts/Kokila.ttf"); txtyour.setTypeface(type); 
 Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/DroidSansFallback.ttf"); TextView tv = (TextView) findViewById(R.id.CustomFontText); tv.setTypeface(tf); 

您可能想要创建包含所有字体的静态类 。 这样,您将不会多次创建可能会严重影响性能的字体。 只要确保在“ 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; } } 

这样,您可以从应用程序的任何地方获取字体。

上面的答案是正确的。 只要确保在“assets”文件夹下创建了一个名为“fonts”的子文件夹,如果您正在使用这段代码。

最好的做法

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

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

希望这会帮助你。

另一种合并字体创建的方法…

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

请注意,这个带易失性字段的双重检查锁定语言只能在Java 1.5+中使用的内存模型正常工作。

这有点旧了,但我稍微改进了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); 

最佳做法是使用Android支持库26.0.0或更高版本。

第1步:添加字体文件

  1. res文件夹中创建新的字体资源字典
  2. 添加字体文件( .ttf.orf

例如,当字体文件将是helvetica_neue.ttf将生成R.font.helvetica_neue

第2步:创建字体系列

  1. 字体文件夹中添加新的资源文件
  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> 

有关更多示例,您可以按照文档:

使用字体

 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继承的View,并在其构造函数上调用setTypeface。

从资产中获取字体并设置给所有的孩子

 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) { } } 
  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. 添加到资产库字体
    在这里输入图像描述

  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. 从列表中选择一种字体
    在这里输入图像描述

也许有点简单:

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

(注意这个代码没有经过测试,但总的来说这个方法应该可以。