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字体的三种方法.md

引言一款视觉优秀的App除了良好的图片和颜色搭配,好的字体也是必不可少的,这里主要介绍Android中修改App字体的三种方法,每种方法都有自己的优缺点,根据实际情况选用。字体文件后缀一般为.ttf,...

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

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

统一更改自定义字体

  • 2015-02-09 21:56
  • 4.98MB
  • 下载

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

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

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

今天google了一下,关于android自定义窗体标题栏的问题,解决方法大概如下:    自定义一个layout,然后通过requestWindowFeature和getWindow().setFe...

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

之前我也写过一篇关于Android竖直跑马灯效果的控件,不过这个控件是基于子Item是纯文本的情况,详情请移步:Android 自定义View实现竖直跑马灯效果,不过后面项目需求发生了变化,必须要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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