成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過修改 LayoutInflater,全局替換字體?。?!

企業(yè)動態(tài)
在 Android 下使用自定義字體已經(jīng)是一個(gè)比較常見的需求了,最近也做了個(gè)比較深入的研究。

[[205971]]

在 Android 下使用自定義字體已經(jīng)是一個(gè)比較常見的需求了,最近也做了個(gè)比較深入的研究。

那么按照慣例我又要出個(gè)一篇有關(guān) Android 修改字體相關(guān)的文章,但是寫下來發(fā)現(xiàn)內(nèi)容還挺多的,所以我決定將它們拆分一下,分幾篇來詳細(xì)的講解。主要會是一些常用的替換字體的方案,最后還會介紹一些全局替換的方案,當(dāng)然也會包含最新的『Fonts in XML』的方案。

期待你持續(xù)關(guān)注。

本篇是本系列的第六篇,之前已經(jīng)發(fā)布的文章,有興趣可以先看看。

Android 字體修改概述|開篇

修改字體需要了解 Typeface 的所有細(xì)節(jié)

簡單粗暴的方式,修改字體

利用反射,修改全局字體

利用 AppCompatDelegate ,全局替換全局字體

一、前言

上一篇講解了通過替換 AppCompatDelegate 來達(dá)到替換控件的目的,從而替換成我們需要的可設(shè)置自定義字體的控件,來達(dá)到替換字體的目的。

現(xiàn)在大多數(shù)人應(yīng)該看出來了,到最后實(shí)現(xiàn)的目標(biāo)就是如何快速、低入侵的替換全局控件,然后對這些控件進(jìn)行重寫,就可以達(dá)到我們很多的目的。換字體只是這其中的一種應(yīng)用,還有其它的,例如:換膚、無痕埋點(diǎn)等等,都是有可借鑒的地方的。

本文再介紹一種方式,通過 LayoutInflaterCompat.setFactory() 替換掉 LayoutInflaterFactory 或者 LayoutInflater.Factory2,來達(dá)到我們替換控件的目的,從而實(shí)現(xiàn)全局字體的替換。

接下來開始介紹所有的技術(shù)細(xì)節(jié)。

二、setFactory()

2.1 setFactory() 的技術(shù)原理

對大家而言,LayoutInflater 應(yīng)該是不陌生的,所有需要動態(tài)加載 layout-xml 中的 View 的地方都需要用到它的 inflater() 方法,例如:ListView、RecyclerView。

而本文需要用到的是它另外兩個(gè) Api 方法,setFactory() 和 setFactory2()。它們的方法簽名如下。

這兩個(gè)方法分別接收 Factory 和 Factory2 ,它們兩個(gè)都是 Interface。并且這兩個(gè)方法的功能也是類似的。只是 setFactory2() 是在 Api Level 11 之后引入的,使用那個(gè)取決于項(xiàng)目的 minSdkVersion。

不過一般而言,我們也不需要直接使用它。我們需要只用 Support.v4 包中,為我們提供的 LayoutInflaterCompat 這個(gè)兼容類來做處理。和所有的兼容類一樣,它其中會有一個(gè) IMPL 的變量,會根據(jù)不同的 Api Level 初始化不同的實(shí)例。

可以看到,這里只對 Api Level 21 作為一個(gè)分界,去處理邏輯,其中會有不同的實(shí)現(xiàn),這里有興趣可以一探究竟,有時(shí)間會單獨(dú)出一篇文章來講解,這里就不再深入了。

這里,我們需要用到 LayoutInflaterCompat.setFactory() 方法,它實(shí)際上已經(jīng)被標(biāo)記為 @Deprecated 了,一般推薦我們使用 LayoutInflaterCompat.setFactory2(),但是它們的功能是一致的,這里就不糾結(jié)這些細(xì)節(jié)了。

可以看到,setFactory() 接收一個(gè) LayoutInflaterFactory 的對象,它實(shí)際上是一個(gè)接口,需要我們實(shí)現(xiàn)其中的 onCreateView() 方法。

我們這里主要的功能,就在于實(shí)現(xiàn) onCreateView() 方法,將我們需要的控件在這個(gè)方法中替換掉。

2.2 舉個(gè)例子

對著源碼說太干了。下面我舉個(gè)實(shí)際的例子,相信就可以說明問題了。

首先我新建一個(gè) Activity,在 super.onCreate() 之前,通過 LayoutInflaterCompat 重新設(shè)置 Factory,在關(guān)鍵地方打印好 Log。

再聲明一個(gè)布局,讓它去顯示 layout-XML 布局,層級很簡單,就是一個(gè) LinearLayout 中間包含了一個(gè) TextView。

然后,我們運(yùn)行起來看看輸出的 Log ,這里撇開了 DecorView 等這些布局的打印,只看關(guān)鍵部分。

從 Log 輸出可以看出,實(shí)際上,你所有布局的控件,都會經(jīng)過 LayoutInflaterFactory.onCreateView() 方法走一遍,去實(shí)現(xiàn)初始化的過程,在其中可以有效的分辨出是什么控件,以及它有什么屬性。

并且 onCreateView() 方法的返回值,就是一個(gè) View,如果要替換該 View,可以在此處將其初始化后返回回去即可。

三、利用 LayoutInflater 替換字體

既然原理都清楚了,那么我們接下來就開始實(shí)際操作一下,如何通過替換 LayoutInflaterFactory 來達(dá)到替換控件,從而達(dá)到替換字體的目的。

首先,定義一個(gè) Activity 為基類,其中在 super.onCreate() 方法之前,調(diào)用 LayoutInflaterCompat.setFactory() ,然后將它的替換為我們自己定義的 CustomFontCompatDelegate 類。

CustomFontCompatDelegate 的實(shí)現(xiàn),也非常的簡單,只需要在它的 onCreateView() 方法中,替換掉 TextView 就可以。

其實(shí),所有替換字體的邏輯,都在 FontTextView 中,接下來我們再看看 FontTextView 的邏輯。

可以看到,在 FontTextView 中,直接完整的將字體替換成我們在 assets 目錄下存放的 custom_font.ttf 字體文件。

到這里就完成了基本的功能,我們接下來看看如何使用它。

只需要使用一個(gè) Activity ,繼承我們剛才實(shí)現(xiàn)的 CustomFontActivity,然后寫一個(gè)簡單的布局,其中有三個(gè) TextView。

最后,我們再來看看運(yùn)行后的效果。

四、小結(jié)

到這里基本上就介紹清楚如何通過 LayoutInflaterCompat.setFactory() 去替換 Factory 這個(gè)接口,達(dá)到我們替換控件的目的,從而完美的替換全局的字體。

但是實(shí)際開發(fā)過程中,依然需要考慮所有可以顯示文字的控件,例如:TextView、EditText、Button 等等,這些都是我們需要重寫的控件。

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請通過微信公眾號聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2017-09-28 15:07:37

全局字體反射

2017-10-23 14:48:33

全局字體開源

2017-09-25 10:51:16

替換字體方式

2017-09-30 08:45:25

AppCompatDe替換字體

2021-10-27 16:52:37

LayoutInfl源碼解析

2023-10-13 17:24:20

5G通信服務(wù)

2024-09-24 10:16:13

PythonWord文檔

2010-03-31 13:46:03

CentOS系統(tǒng)

2017-09-19 14:55:27

Android字體修改

2022-09-22 15:29:17

public-SDK應(yīng)用開發(fā)

2022-02-11 09:38:14

Java技巧反射

2010-09-09 17:13:06

2023-07-24 08:00:56

客戶端訪問指定

2017-09-22 14:12:33

Android字體 Typeface

2022-11-28 09:19:33

2021-10-15 11:37:44

反爬蟲破解

2015-12-10 17:02:59

2020-12-17 09:52:43

WEBWindows ser修改密碼

2023-12-07 09:17:44

java分布式

2024-07-12 14:27:36

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄色片网此| 伊人免费视频二 | 久久精品二区亚洲w码 | 久久久久久国产精品 | 亚洲精久久久 | 99久久婷婷国产综合精品电影 | 午夜一区二区三区在线观看 | 亚洲精品无 | 精品亚洲一区二区三区四区五区 | 高清欧美性猛交 | 国产日韩精品在线 | 久久久久久高潮国产精品视 | 波多野吉衣在线播放 | 欧美色综合一区二区三区 | 古装人性做爰av网站 | 免费黄篇| 在线中文字幕亚洲 | 亚洲高清在线观看 | 亚洲欧美综合精品另类天天更新 | 久久久av | av毛片 | 天天爱综合 | 99精品久久久久久久 | 亚洲欧美综合 | 欧美激情一区 | 一区二区三区精品视频 | 成人啊啊啊 | 久久精品国产一区 | 国产在线二区 | 精品免费国产一区二区三区四区 | 高清国产午夜精品久久久久久 | 成人在线欧美 | 欧美性一区二区三区 | 免费国产视频在线观看 | 亚洲成人精品 | 中文av字幕 | 久久久精品黄色 | 黑人巨大精品欧美一区二区免费 | 99精品网| 日韩在线观看网站 | www.中文字幕.com|