在网上跑图几个小时,终于总结完。

行吧行吧,发车……

开发过程中,布局文件中指定仅限于系统自带的四种字体(android Studio 3.0.1),就如:

嫌丑都不喜欢?去下载字体包吧我是免费商用字体下载链接字体下载,下载完成导入到项目,在assets文件夹(和Java文件夹同级,没有新建)中新建fonts文件夹,如图

最简单的替换方式

Typeface TypeFaceYaHei = Typeface.createFromAsset(mActivity.getAssets(), "fonts/xiaowei.otf");

((TextView) findViewById(R.id.tv_practice)).setTypeface(TypeFaceYaHei, Typeface.BOLD);

文件映射的方式进行替换

在自己的Application中进行字体文件映射,

private static Typeface TypeFaceYaHei;

public static void getTypeFace(Activity activity, int i) {

switch (i) {

case 1:

TypeFaceYaHei = Typeface.createFromAsset(mContext.getAssets(), "fonts/xiaowei.otf");

break;

case 2:

TypeFaceYaHei = Typeface.createFromAsset(mContext.getAssets(), "fonts/bufferType.ttf");

break;

}

try {

Field field = Typeface.class.getDeclaredField("MONOSPACE");

field.setAccessible(true);

field.set(null, TypeFaceYaHei);

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}}

这样,就能完成每次启动App时完成字体替换的功能!是的,每次启动时。但是这不是我想要的效果!!!?我想要实时更改字体,就行Android手机设置里更改字体一样,选择了想要的字体后,立马完成替换效果。那就继续往下看。

像Android系统一样实时替换选择的字体的效果要完成这个效果,我首先想到的方法是这样的:在选择字体之后,

然后,在每个页面中进行强制刷新页面

((ViewGroup) mActivity.findViewById(android.R.id.content)).invalidate();

然后。。。。对不起,没有如预料的进行刷新。

好气啊!!!继续想办法,然后就想到拿到布局对里面的元素进行递归修改属于TextView的控件的字体属性,说干就干

首先拿到字体:

Typeface.createFromAsset(context.getAssets(), fontPath);

再拿到根布局对象:

((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0);

然后就是递归替换了:

if (root instanceof TextView) {

// 如果是textView,进行替换

TextView textView = (TextView) root;

int style = Typeface.NORMAL;

if (textView.getTypeface() != null) {

style = textView.getTypeface().getStyle();

}

textView.setTypeface(createTypeface(root.getContext(), fontPath), style);

} else if (root instanceof ViewGroup) {

// 如果是ViewGroup,再递归这个布局,重复上这个动作

ViewGroup viewGroup = (ViewGroup) root;

for (int i = 0; i < viewGroup.getChildCount(); ++i) {

replaceFont(viewGroup.getChildAt(i), fontPath);

}

}

利用方法三,再通过BroadcastRecerver完成全局修改字体的需求。

最后抽象出一个工具类:

/**

* explain

* Created by GerryRun on 2018/4/11 0011.

* e-mail gerryrun@qq.com

*/

public class ReplaceTypefaceUtil {

private static final String TAG = ReplaceTypefaceUtil.class.getSimpleName();

private static Typeface TypeFaceYaHei;

public static void getTypeFace(Activity activity, int i) {

switch (i) {

case 1:

TypeFaceYaHei = Typeface.createFromAsset(activity.getApplication().getAssets(), "fonts/xiaowei.otf");

ReplaceTypefaceUtil.replaceFont(activity, "fonts/xiaowei.otf");

break;

case 2:

TypeFaceYaHei = Typeface.createFromAsset(activity.getApplication().getAssets(), "fonts/bufferType.ttf");

ReplaceTypefaceUtil.replaceFont(activity, "fonts/bufferType.ttf");

break;

}

try {

Field field = Typeface.class.getDeclaredField("MONOSPACE");

field.setAccessible(true);

field.set(null, TypeFaceYaHei);

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

public static void replaceFont(@NonNull View root, String fontPath) {

if (root == null || TextUtils.isEmpty(fontPath)) {

Log.e(TAG, "root cannot be null");

return;

}

if (root instanceof TextView) {

// 如果是TextView,进行替换

TextView textView = (TextView) root;

int style = Typeface.NORMAL;

if (textView.getTypeface() != null) {

style = textView.getTypeface().getStyle();

}

textView.setTypeface(createTypeface(root.getContext(), fontPath), style);

} else if (root instanceof ViewGroup) {

// 如果是ViewGroup,再递归这个布局,重复上这个动作

ViewGroup viewGroup = (ViewGroup) root;

for (int i = 0; i < viewGroup.getChildCount(); ++i) {

replaceFont(viewGroup.getChildAt(i), fontPath);

}

}

}

public static void replaceFont(@NonNull Activity context, String fontPath) {

replaceFont(getRootView(context), fontPath);

}

public static Typeface createTypeface(Context context, String fontPath) {

return Typeface.createFromAsset(context.getAssets(), fontPath);

}

/**

* 获取根布局

*

* @param context

* @return

*/

public static View getRootView(Activity context) {

return ((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0);

}

}

用法很简单:

((TextView) findViewById(R.id.tv_practice)).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

ReplaceTypefaceUtil.getTypeFace(mActivity, 2);

}

});

效果图:

android 英文语言设置字体,Android中通过typeface设置字体-Go语言中文社区相关推荐

  1. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  2. android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)

    LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场时都按照这个动画出场. LayoutAnimation作用于viewgroup有两种方式: 1 ...

  3. 华为手机恢复出厂设置出现com.android.phone,如何在华为手机中恢复出厂设置?怎么在华为手机中一键还原?...

    如何在华为手机中恢复出厂设置?怎么在华为手机中一键还原? 许多使用华为手机的小伙伴在使用一段时间手机过后,手机会变得有些卡顿,我们可以将手机恢复出厂设置来缓解手机卡顿的现象,今天,小编就教大家在华为手 ...

  4. c 程序多语言,怎样在程序中利用C支持多国语言

    怎样在程序中利用C支持多国语言 本文以emule为例,探讨一下多国语言支持的实现.选择emule,因为它的多国语言支持实现的相当好,可以支持动态切换.而且最关键,它是开源的,可以直接通过源码来研究它的 ...

  5. linux系统中怎么设置网络,vmware中linux怎么设置网络

    vmware中linux怎么设置网络 本站整理   发布时间:2009-03-10 12:18:33   作者:jb51.net   我要评论 如果你的XXX卡没被内核支持,又怕自己编译的内核会造成系 ...

  6. php增加vip等级设置,会员管理系统中商家如何设置会员等级

    会员等级的诞生,从商家的角度来看是为了促进顾客.会员更多的消费:从会员的角度来看,是一种会员身份的象征,从会员等级中,会员可以享受不同的折扣与优惠.那么商家应该如何来给我们的会员设置等级呢?怎么设才最 ...

  7. citra 图形设置_FL Studio中的常规设置

    今天我们来介绍FL Studio中的常规设置.要打开常规设置,我们需要在主菜单中选择选项>常规选项,当然也可以直接按快捷键F10. 图1:常规设置 "常规设置"页面的主要功能 ...

  8. android typeface设置字体,Android中通过typeface设置字体

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 今天整理过去的笔记时,发现之前我记录了一个关于android typeface字体设置的辟谣笔记 这里分享出来//将字体 ...

  9. android px转字体大小,用于设置字体大小android sp,px或pt中最常用的字体大小

    0 px Pixels - corresponds to actual pixels on the screen. 像素 - 对应于屏幕上的实际像素. in Inches - based on the ...

最新文章

  1. 技术图文:如何利用C# + Echarts 绘制 Bar Simple?
  2. Python代码发现链表中的环并输出环中的第一个元素
  3. 与Andrey Breslav谈论Kotlin 1.0的发布
  4. python中的seth函数_Python入门——turtle库的使用
  5. 最新版 VMware 安装,虚拟机安装, Ubuntu可视化linux系统安装
  6. 20190808估值方法
  7. VB.NET 使用DirectSound9 (3) StreamAudio
  8. OJ-1:时钟问题【九度1553】
  9. Ubuntu环境下安装UliPad
  10. matlab里uicontrol的用法,Matlab uicontrol举例
  11. 清华EMBA课程系列思考之十七(1) -- 新企业的孵化与创业投资
  12. ntag213和215有什么区别_NTAG213、NTAG215和NTAG216NFC标签
  13. Win10投影到此电脑用不了,投影此电脑是灰色
  14. python输出列表元素_怎样用一行python打印列表所有元素
  15. 2020年度整理国内一线互联网公司内部Android面试题库
  16. jQuery属性操作以及一些实用方法
  17. android x86耗电,X86挑战ARM 29项测试揭秘鲜为人知的功耗
  18. android 九宫格轨迹密码
  19. scm中mysql作用_SCM系统的作用有哪些
  20. 外贸专员简历表-Word简历可编辑下载

热门文章

  1. 【设计模式】用英雄联盟来解释装饰者模式
  2. 秒懂函数回调机制,回调函数看这篇就够了
  3. 控制手机屏幕只能横向 根据手机中心翻转
  4. dede 掉调用优酷视
  5. linux桌面xfce,Xfce 4.14 发布,Linux桌面环境
  6. 【软考中级】多媒体应用设计师复习笔记第五章
  7. 北京化工大学 2022-2023-1 ACM集训队每周程序设计竞赛(7)题解
  8. C.3 知识图谱项目实战(一):瑞金医院MMC人工智能辅助构建知识图谱--初赛实体识别
  9. 车路云协同规模化开启,云控基础平台落地加速
  10. 计算机图形学有很多应用,计算机图形学的论文_计算机图形学有很多应用_计算机科学与技术的论文...