【第22期】观点:IT 行业加班,到底有没有价值?

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字体

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

相关文章推荐

高分子材料的化学改性

1.无规共聚  无规共聚是指由两种或多种单体在生成的共聚物主链上单体单元无规排列,随机分布,没有一种单体单元能在分子链上形成单独的较长链段的共聚反应,其产物称为无规共聚物,如丁二烯-苯乙烯无规共聚物、...

《C++设计模式》第二章:创建(对象)型模式之工厂模式(多态性工厂模式)

一、什么时候需要使用工厂模式?     1.用new去创建一个对象(因为new的过程可能还需要做一些初始化工作)的过程很复杂,但是又有很多地方要用这个对象;     2.随着项目的深入,一个类可能...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

非修改性序列算法之min_element和max_element

min_element是求容器中的最小值,有两种函数重载:第一种,单纯的比较大小:template inline _FwdIt min_element(_FwdIt _First, _FwdI...

HTML5 API --- 页面可见性改变(visibilitychange)事件

visibilitychange事件是浏览器新添加的一个事件,当浏览器的某个标签页切换到后台,或从后台切换到前台时就会触发该消息,现在主流的浏览器都支持该消息了,例如Chrome, Firefox, ...

ConcurrencyHashMap并发修改性能比较

由于ConcurrecyHashMap允许并发修改,无需加锁,因此测试其性能 package concurrencyTest; import java.util.Iterator; impo...

多用户同时处理同一条数据解决办法

事务处理(多用户同时操作一条信息时是用-并发) 在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突; 据说办法有二:1。打开同时锁定表的记录 2。浦获错误,撤消其中一个...

Clion IDE 个性修改

1 File->Settings->Editor->General->Appearance 2.修改字体 File->Settings->Editor->Colors & Fonts->Fon...

app的某些高度

#define App_Frame_H ([[UIScreen mainScreen] applicationFrame].size.height) #define MAIN_FRAM...

统一li高度以最大的为基准的自适应高度

先获取最高的li高度,然后将所有的li重新设置一下高度              TODO supply a title                           ...

自定义ViewGroup之Topbar----布局代码的缩减,实现app风格的高度一致

最近写项目,有二三十个布局,都具有相同风格的标题栏,如果每一个界面都反复写一个布局,重复的工作太多,代码重复也多,于是自定义一个ViewGroup作为通用的Topbar,通过设置标签属性达到风格一致,...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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