为完整的android应用程序添加自定义字体

在我的应用程序,我需要使用helvetica字体的所有textviews和编辑文本字段。 有什么办法可以做到这一点,而不是每个文本视图使用settypeface方法? 任何build议将是一个很大的帮助。

提前致谢 !

Solutions Collecting From Web of "为完整的android应用程序添加自定义字体"

我自己想清楚了。 这是我使用的代码。 我创build自定义的TextView ,它具有作为默认字体的自定义字体。

 public class MyTextView extends TextView { public MyTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyTextView(Context context) { super(context); init(); } public void init() { Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/chiller.ttf"); setTypeface(tf ,1); } } 

在你的活动中,就在你打电话之后

的setContentView(R.id.blahblah);

你应该运行一个方法来遍历小部件的整个层次结构,并处理字体replace,比如;

 setContentView(R.id.blahblah); Utils.overrideFonts(this, findViewById(android.R.id.content)); 

而提到的“overrideFonts”方法应该是这样的;

 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(FONT_REGULAR); } } catch (Exception e) { e.printStackTrace(); // ignore } } 

在这个scheme中,FONT_REGULAR应该被安全的初始化,你可能会喜欢单身或其他方式来确保它被正确初始化。

 private static void initializeFonts(final Context context) { FONT_REGULAR = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_medium.otf"); FONT_BOLD = Typeface.createFromAsset(context.getAssets(), "fonts/myfont_bold.otf"); } 

如果您使用像MyAppActivity(扩展活动)的Activity的子类,那么您不需要更改每个和每个Activity类的定制。 相反,你可以切入它,并覆盖这样的行为;

 public class MyAppActivity extends Activity { ... ... @Override public void setContentView(final int layoutResID) { super.setContentView(layoutResID); Utils.overrideFonts(this, findViewById(android.R.id.content)); } ... ... } 

这样,你可以使用你的任何活动有共同的行为;

 public class SettingsUI extends MyAppActivity { ... ... } 

我希望这有助于…干杯!

创build一个样式并使用它所有的文本属性。

 <style name="CustomText"> <item name="android:typeface">YourFontName</item> </style> 

用它:

 <TextView style="@style/CustomText" /> 

以上是在所有活动中使用自定义字体进行自定义,您可以使用….

 Typeface font = Typeface.createFromAsset(getAssets(), "CustomFontName.ttf"); txt.setTypeface(font); 

尝试这个。

要在所有应用程序中应用自定义字体,只需创build以下活动:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FontManager.getInstance().initialize(this, R.xml.fonts); setContentView(R.layout.main); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { SimpleFactory factory = new SimpleFactory(); return factory.onCreateView(name, context, attrs); } 

其中FontManager是类,它pipe理在/xml/fonts.xml中定义的所有字体,以及仅在工厂创build视图并将自定义字体应用于每个视图的文本视图实例的SimpleFactory。

/xml/fonts.xml

 <?xml version="1.0" encoding="utf-8"?> <familyset> <family> <nameset> <!--Font name--> <name>HelveticaNeueLTStd</name> </nameset> <fileset> <!--Font styles--> <file style="normal">fonts/HelveticaNeueLTStd-LtCn.otf</file> <file style="bold">fonts/HelveticaNeueLTStd-MdCn.otf</file> <file style="italic">fonts/HelveticaNeueLTStd-LtCnO.otf</file> <file style="bold_italic">fonts/HelveticaNeueLTStd-MdCnO.otf</file> </fileset> </family> <family> <!--There new font family can be added, don't forget add font files into /assets/fonts directory and put the name of the font into /values/string/font.xml--> </family> </familyset> 

FontFactory – Abastract类,只是扩展它来创build自己的工厂

 public abstract class FontFactory implements LayoutInflater.Factory{ public final String TAG = getClass().getSimpleName(); static final Class<?>[] mConstructorSignature = new Class[] {Context.class, AttributeSet.class}; final Object[] mConstructorArgs = new Object[2]; private static final String[] sClassPrefixList = { "android.widget.", "android.webkit." }; @Override public View onCreateView(String name, Context context, AttributeSet attrs) { if("ViewStub".equals(name) || "View".equals(name)){ return null; } View view = null; Constructor<? extends View> constructor = null; Class clazz = null; if (view == null) { if (-1 == name.indexOf('.')) { for (String prefix : sClassPrefixList) { clazz = getClazz(prefix, name); if(clazz != null){ break; } } } else { clazz = getClazz("", name); } } if (clazz == null) { Log.d(TAG, "View can't be created " + name); return null; } try { constructor = clazz.getConstructor(mConstructorSignature); } catch (NoSuchMethodException e) { e.printStackTrace(); } Object[] args = mConstructorArgs; args[1] = attrs; if(constructor == null){ return null; } try { view = constructor.newInstance(context, attrs); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } if(view != null){ onFontApply(context, view); } return view; } public abstract void onFontApply(Context context, View view); private Class getClazz(String prefix, String name){ Class clazz = null; try { clazz = Class.forName(prefix + name); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { return clazz; } } } 

FontManager – 只需将/xml/fonts.xml中定义的字体文件映射到放置在/ assets目录中的字体文件,并按字体名称和字体样式返回TypeFace。

 public void initialize(Context context, int resId) { if(mFonts != null){ Log.d(TAG,"FontManager have already initialized"); return; } XmlResourceParser parser = null; try { parser = context.getResources().getXml(resId); mFonts = new ArrayList<Font>(); String tag; String fontStryleAttr = null; int eventType = parser.getEventType(); Font font = null; do { tag = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if (tag.equals(TAG_FAMILY)) { // one of the font-families. font = new Font(); } else if (tag.equals(TAG_NAMESET)) { // a list of font-family names supported. font.families = new ArrayList<String>(); } else if (tag.equals(TAG_NAME)) { isName = true; } else if (tag.equals(TAG_FILESET)) { // a list of files specifying the different styles. font.styles = new ArrayList<FontStyle>(); } else if (tag.equals(TAG_FILE)) { isFile = true; fontStryleAttr = parser.getAttributeValue(null, ATTR_STYLE); } break; case XmlPullParser.END_TAG: if (tag.equals(TAG_FAMILY)) { // add it to the list. if (font != null) { mFonts.add(font); font = null; } } else if (tag.equals(TAG_NAME)) { isName = false; } else if (tag.equals(TAG_FILE)) { isFile = false; fontStryleAttr = null; } break; case XmlPullParser.TEXT: String text = parser.getText(); if (isName) { // value is a name, add it to list of family-names. if (font.families != null) font.families.add(text); } else if (isFile) { // value is a file, add it to the proper kind. FontStyle fontStyle = new FontStyle(); fontStyle.font = Typeface.createFromAsset(context.getAssets(), text); String attr = parser.getAttributeValue(null, ATTR_STYLE); if (fontStryleAttr.equals(STYLE_BOLD)) fontStyle.style = Typeface.BOLD; else if (fontStryleAttr.equals(STYLE_ITALIC)) fontStyle.style = Typeface.ITALIC; else if (fontStryleAttr.equals(STYLE_BOLD_ITALIC)) fontStyle.style = Typeface.BOLD_ITALIC; else fontStyle.style = Typeface.NORMAL; font.styles.add(fontStyle); } } eventType = parser.next(); } while (eventType != XmlPullParser.END_DOCUMENT); } catch (XmlPullParserException e) { throw new InflateException("Error inflating font XML", e); } catch (IOException e) { throw new InflateException("Error inflating font XML", e); } finally { if (parser != null) parser.close(); } } public Typeface get(String family, int style) { for (Font font: mFonts) { for (String familyName : font.families) { if (familyName.equals(family)) { // if no style in specified, return normal style. if (style == -1) style = Typeface.NORMAL; for (FontStyle fontStyle : font.styles) { if (fontStyle.style == style) return fontStyle.font; } } } } return mDefaultFont; } 

更多的代码和示例只是看这里

好吧,你可以做到这一点,但你基本上想做的是一个有点地图格式的字体地图集(它将不得不以unicode顺序开始运行!“#$%'()x +, – 。/)。将要做的就是抽出一个string来制定出各个对应的字母在哪里。

它不是太容易,但每个angular色必须具有相同的长度和宽度,你可以有不同的长度,但这将是一个困难。

你可以在http://bit.ly/1bzjWQn上使用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="MyFont.ttf" /> 

别忘了实现scheme(xmlns:pixlui =“http://schemas.android.com/apk/com.neopixl.pixlui”&#xFF09;

  setContentView(R.layout.activity_main); custfont(this, findViewById(android.R.id.content)); private void custfont(final Context context, 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(), "fonts/ostrichblack.ttf")); } } catch (Exception e) { } } 
 import android.content.Context; import android.graphics.Typeface; /** * Created by Sanjeev Kumar on 4/18/2017. */ public class FontManager { public Context mContext; public FontManager(Context context) { this.mContext = context; } public Typeface getSquarkiFont() { return Typeface.createFromAsset(mContext.getAssets(), "fonts/Squarki.ttf"); } public Typeface getLazySpringDayFont() { return Typeface.createFromAsset(mContext.getAssets(), "fonts/LazySpringDay.ttf"); } }