Android统一一次性修改整个APP自定义字体

原创 2016年08月30日 14:49:44

有几个实现思路:

1自定义FontTextView extends TextView,设置自定义字体(太繁琐,需要在布局一个个去替换)

2:通过反射机制修改系统默认的字体,一次性修改APP字体,(推荐此方法)

3:也可以通过遍历的方式一个一个设置TextView字体(不推荐)

1:自定义FontTextView:

1:

package com.example.aidltesttwo.activity;

import com.example.aidltesttwo.R;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {

private Context mContext;
private AssetManager mAssetManager;
// 字体类型
private String mFontType;
// 细体
private final String mLight = "light";
// 普通字体
private final String normal = "normal";

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

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

private void init(Context context, AttributeSet attrs, int defStyle) {
mContext = context;
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TypeFace, 0, 0);

mFontType = typedArray.getString(R.styleable.TypeFace_TypeFace_Type);

typedArray.recycle();
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
getAssetManagerInstance();
if (mFontType != null && !"".equals(mFontType)) {
// 细体
if (mLight.equals(mFontType)) {
//此处务必使用单列,不然频繁调用会导致开销大,卡顿
Typeface typeFace = Typeface.createFromAsset(mAssetManager, "fonts/PingFang_Light.ttf");
setTypeface(typeFace);
}
// 正常字体
if (normal.equals(mFontType)) {
//此处务必使用单列,不然频繁调用会导致开销大,卡顿
Typeface typeFace = Typeface.createFromAsset(mAssetManager, "fonts/PingFang Medium.ttf");
setTypeface(typeFace);
}
}
}

// 单列获取,防止多次获取增加消耗
private void getAssetManagerInstance() {
if (mAssetManager == null) {
synchronized (FontTextView.class) {
if (mAssetManager == null) {
mAssetManager = mContext.getAssets();
}
}
}

}
}

2:  attrs文件下申明一个字体类型的属性  

<declare-styleable name="TypeFace">
        <attr name="TypeFace_Type" format="string"></attr>
    </declare-styleable>

3:布局中引用

引入命名空间:xmlns:fontType="http://schemas.android.com/apk/res-auto"

 <com.example.aidltesttwo.activity.FontTextView
      android:layout_width="match_parent"
        android:layout_height="wrap_content"
download.csdn.net
      android:gravity="center"
      android:text="normal在做一个游戏,游戏的标怎么才能实现,在线等 谢谢"

android:textSize="18sp"
      fontType:TypeFace_Type="normal"
      android:typeface="sans" /
>


2:通过反射修改系统默认字体(推荐)

1:给应用添加默认字体(在Application下的主题添加默认的TypeFace)如下

<style name="AppTheme" parent="android:Theme.Light">
        <item name="android:typeface">monospace</item>
    </style>

2:自定义MoblieApplication继承Application(需要在AndroidManifest.xml中申明)

3:MoblieApplication的oncreate()通过反射方法中修改APP默认字体

package com.example.aidltesttwo;

import java.lang.reflect.Field;

import android.app.Application;
import android.content.Context;
import android.graphics.Typeface;

public class MoblieApplication extends Application {

private static final String TAG = "MoblieApplication";

//字体地址,一般放置在assets/fonts目录
String fontPath = "fonts/PingFang_Light.ttf";

@Override
public void onCreate() {
replaceSystemDefaultFont(this, fontPath);

}

public void replaceSystemDefaultFont(Context context, String fontPath) {

//這里我们修改的是MoNOSPACE,是因为我们在主题里给app设置的默认字体就是monospace,设置其他的也可以
replaceTypefaceField("MONOSPACE", createTypeface(context, fontPath));
}
//通过字体地址创建自定义字体
private Typeface createTypeface(Context context, String fontPath) {
return Typeface.createFromAsset(context.getAssets(), fontPath);
}
//关键--》通过修改MONOSPACE字体为自定义的字体达到修改app默认字体的目的
private void replaceTypefaceField(String fieldName, Object value) {
try {
Field defaultField = Typeface.class.getDeclaredField(fieldName);
defaultField.setAccessible(true);
defaultField.set(null, value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

}

现在,大功告成了^______^点此下载PingFang字体

版权声明:本文为博主原创文章,未经博主允许不得转载。

太激动!Android修改全局字体样式,替换整个APP字体

最近一直在如何全局修改app字体上困惑着,今天终于有了突破。我将搜集的资料进行了整理,现在提供给大家。参考链接: Android应用使用自定义字体 Android应用使用自定义字体的一些探究 A...
  • Gold_brick
  • Gold_brick
  • 2016年10月20日 00:36
  • 11174

Android设置全局字体大小解决方案

今天是中秋,中秋还在研究代码的都比较苦逼,先Mark一下。 App中要用到字体大小设置,网上有很多文章。但百度,google了半天,对我来说,只有以下两篇有帮助,先附上链接: http...
  • mrwangxsyz
  • mrwangxsyz
  • 2015年09月27日 16:52
  • 4075

统一更改自定义字体

  • 2015年02月09日 21:56
  • 4.98MB
  • 下载

Android 自定义ViewGroup实现整个Item布局竖直跑马灯效果

  • 2016年08月03日 10:21
  • 1.58MB
  • 下载

android 自定义键盘 随机数字按键 修改键盘字体颜色等功能实现

  • 2014年03月07日 13:33
  • 1.19MB
  • 下载

自定义指示器 快速实现 ViewPager 滑动页卡切换(可用作整个 app上导航)

我记得在前面,我写了一篇Android 微信6.1 tab栏图标和字体颜色渐变的实现,如果大家仅仅认为这篇文章的功能只是模仿微信颜色渐变效果,那就大错特错了!认真阅读了这篇文章的朋友,应该知道,这里面...
  • pjbwan
  • pjbwan
  • 2015年04月27日 23:15
  • 309

android 修改窗体标题的字体式样和背景图(自定义标题栏)

今天google了一下,关于android自定义窗体标题栏的问题,解决方法大概如下:    自定义一个layout,然后通过requestWindowFeature和getWindow().setFe...
  • lusonmo
  • lusonmo
  • 2011年02月18日 13:49
  • 30106

Android例子源码可以一次性选择两个日期的自定义日历控件

  • 2016年04月26日 17:06
  • 1.58MB
  • 下载

整个网络可能最完善的 Android 自定义键盘 问题汇总以及解决方案

系统自带的键盘,键值太多,不符合客户的需求,需要自定义键盘,如下图:       分别是字母和数字的键盘,感谢很多前辈提供的例子,朋友们可以到这个链接下载资源:前辈android 自定...
  • omayyouhappy
  • omayyouhappy
  • 2015年09月15日 09:58
  • 3087

Android 自定义ViewGroup实现整个Item布局竖直跑马灯效果

之前我也写过一篇关于Android竖直跑马灯效果的控件,不过这个控件是基于子Item是纯文本的情况,详情请移步:Android 自定义View实现竖直跑马灯效果,不过后面项目需求发生了变化,必须要...
  • cc_lova_wxf
  • cc_lova_wxf
  • 2016年08月03日 11:13
  • 1903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android统一一次性修改整个APP自定义字体
举报原因:
原因补充:

(最多只允许输入30个字)