资讯专栏INFORMATION COLUMN

通过修改 LayoutInflater,全局替换字体!!!

mengera88 / 743人阅读

摘要:本文再介绍一种方式,通过替换掉或者,来达到我们替换控件的目的,从而实现全局字体的替换。四小结到这里基本上就介绍清楚如何通过去替换这个接口,达到我们替换控件的目的,从而完美的替换全局的字体。

在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也做了个比较深入的研究。

那么按照惯例我又要出个一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我决定将它们拆分一下,分几篇来详细的讲解。主要会是一些常用的替换字体的方案,最后还会介绍一些全局替换的方案,当然也会包含最新的 『Fonts in XML』的方案。

期待你持续关注。

本篇是本系列的第六篇,之前已经发布的文章,有兴趣可以先看看。

Android 字体修改概述|开篇

修改字体需要了解 Typeface 的所有细节

简单粗暴的方式,修改字体

利用反射,修改全局字体

利用 AppCompatDelegate ,全局替换全局字体

一、前言

上一篇讲解了通过替换 AppCompatDelegate 来达到替换控件的目的,从而替换成我们需要的可设置自定义字体的控件,来达到替换字体的目的。

现在大多数人应该看出来了,到最后实现的目标就是如何快速、低入侵的替换全局控件,然后对这些控件进行重写,就可以达到我们很多的目的。换字体只是这其中的一种应用,还有其它的,例如:换肤、无痕埋点等等,都是有可借鉴的地方的。

本文再介绍一种方式,通过 LayoutInflaterCompat.setFactory() 替换掉 LayoutInflaterFactory 或者 LayoutInflater.Factory2,来达到我们替换控件的目的,从而实现全局字体的替换。

接下来开始介绍所有的技术细节。

二、setFactory() 2.1 setFactory() 的技术原理

对大家而言,LayoutInflater 应该是不陌生的,所有需要动态加载 layout-xml 中的 View 的地方都需要用到它的 inflater() 方法,例如:ListView、RecyclerView。

而本文需要用到的是它另外两个 Api 方法,setFactory()setFactory2()。它们的方法签名如下。

这两个方法分别接收 Factory 和 Factory2 ,它们两个都是 Interface。并且这两个方法的功能也是类似的。只是 setFactory2() 是在 Api Level 11 之后引入的,使用那个取决于项目的 minSdkVersion。

不过一般而言,我们也不需要直接使用它。我们需要只用 Support.v4 包中,为我们提供的 LayoutInflaterCompat 这个兼容类来做处理。和所有的兼容类一样,它其中会有一个 IMPL 的变量,会根据不同的 Api Level 初始化不同的实例。

可以看到,这里只对 Api Level 21 作为一个分界,去处理逻辑,其中会有不同的实现,这里有兴趣可以一探究竟,有时间会多带带出一篇文章来讲解,这里就不再深入了。

这里,我们需要用到 LayoutInflaterCompat.setFactory() 方法,它实际上已经被标记为 @Deprecated 了,一般推荐我们使用 LayoutInflaterCompat.setFactory2(),但是它们的功能是一致的,这里就不纠结这些细节了。

可以看到,setFactory() 接收一个 LayoutInflaterFactory 的对象,它实际上是一个接口,需要我们实现其中的 onCreateView() 方法。

我们这里主要的功能,就在于实现 onCreateView() 方法,将我们需要的控件在这个方法中替换掉。

2.2 举个例子

对着源码说太干了。下面我举个实际的例子,相信就可以说明问题了。

首先我新建一个 Activity,在 super.onCreate() 之前,通过 LayoutInflaterCompat 重新设置 Factory,在关键地方打印好 Log。

再声明一个布局,让它去显示 layout-XML 布局,层级很简单,就是一个 LinearLayout 中间包含了一个 TextView。

然后,我们运行起来看看输出的 Log ,这里撇开了 DecorView 等这些布局的打印,只看关键部分。

从 Log 输出可以看出,实际上,你所有布局的控件,都会经过 LayoutInflaterFactory.onCreateView() 方法走一遍,去实现初始化的过程,在其中可以有效的分辨出是什么控件,以及它有什么属性。

并且 onCreateView() 方法的返回值,就是一个 View,如果要替换该 View,可以在此处将其初始化后返回回去即可。

三、利用 LayoutInflater 替换字体

既然原理都清楚了,那么我们接下来就开始实际操作一下,如何通过替换 LayoutInflaterFactory 来达到替换控件,从而达到替换字体的目的。

首先,定义一个 Activity 为基类,其中在 super..onCreate() 方法之前,调用 LayoutInflaterCompat.setFactory() ,然后将它的替换为 我们自己定义的 CustomFontCompatDelegate 类。

CustomFontCompatDelegate 的实现,也非常的简单,只需要在它的 onCreateView() 方法中,替换掉 TextView 就可以。

其实,所有替换字体的逻辑,都在 FontTextView 中,接下来我们再看看 FontTextView 的逻辑。

可以看到,在 FontTextView 中,直接完整的将字体替换成我们在 assets 目录下存放的 custom_font.ttf 字体文件。

到这里就完成了基本的功能,我们接下来看看如何使用它。

只需要使用一个 Activity ,继承我们刚才实现的 CustomFontActivity,然后写一个简单的布局,其中有三个 TextView。

最后,我们再来看看运行后的效果。

四、小结

到这里基本上就介绍清楚如何通过 LayoutInflaterCompat.setFactory() 去替换 Factory 这个接口,达到我们替换控件的目的,从而完美的替换全局的字体。

但是实际开发过程中,依然需要考虑所有可以显示文字的控件,例如:TextView、EditText、Button 等等,这些都是我们需要重写的控件。

点赞或者分享吧~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13967.html

相关文章

  • 全局替换字体,开源库更方便!!!

    摘要:本文就介绍一个上,比较火的全局替换字体的开源库,差不多阅读文档加集成,一个小时全局替换字体不是梦。这个开源替换字体库就是二如何使用既然是要接入开源库来全局替换字体,先来看看它可以实现的效果。 showImg(https://segmentfault.com/img/remote/1460000011604013?w=900&h=500); 序 在 Android 下使用自定义字体已经是...

    wua_wua2012 评论0 收藏0
  • 看完九篇字体系列的文章,你还觉得我是在说字体

    摘要:利用成熟开源库,替换全局字体。而使用成熟的开源库,也是一个不错的方案。 showImg(https://segmentfault.com/img/remote/1460000011693620?w=900&h=500); 关注过我的公众号一段时间的朋友,都应该知道,最近一段时间,断断续续的一直在写一个关于修改 App 字体的系列文章,到现在已经写了九篇了,差不多算是将我觉得和字体有关的...

    wean 评论0 收藏0
  • 2017-10-10 前端日报

    摘要:前端日报精选第期写给前端应届生的职业规划建议应用编译优化之路进阶篇命名空间模式解析源码解析之任务管理入门教程快速上手聊聊改变历史中文正式发布,带来种新的图表类型关系图解好好写代码吧使用手册掘金发布在即将全面支持掘金仿懂球帝 2017-10-10 前端日报 精选 【第1074期】写给前端应届生的职业规划建议webpack 应用编译优化之路JS进阶篇--命名空间模式解析gulp源码解析之任...

    myshell 评论0 收藏0
  • 全局修改默认字体通过反射也能做到

    摘要:今天介绍的就是其中的一个,使用反射的方式,修改中的某个字体,来达到全局替换的目的。修改的某个默认字体首先需要明确一点,在中,所有操作字体的动作,都会使用到这个类。 showImg(https://segmentfault.com/img/remote/1460000011401801?w=658&h=439); 序 在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也...

    刘德刚 评论0 收藏0
  • 粗暴的方式,替换全局字体

    摘要:本篇会先介绍两种比较粗暴的方式来修改全局的字体。在这个的方法里,回去判断是否继承自,如果是就替换字体。从下期开始,就会开始介绍一些更优雅的方式,在现有项目上,全局的替换字体的一些方案。 showImg(https://segmentfault.com/img/remote/1460000011401721?w=500&h=330); 序 在 Android 下使用自定义字体已经是一个比...

    Worktile 评论0 收藏0

发表评论

0条评论

mengera88

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<