通過修改 LayoutInflater,全局替換字體3藁Α=伊А!

/WechatIMG13.jpeg

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

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

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

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

一茁肠、前言

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

現(xiàn)在大多數(shù)人應(yīng)該看出來了酒奶,到最后實現(xiàn)的目標就是如何快速、低入侵的替換全局控件奶赔,然后對這些控件進行重寫惋嚎,就可以達到我們很多的目的。換字體只是這其中的一種應(yīng)用站刑,還有其它的另伍,例如:換膚、無痕埋點等等绞旅,都是有可借鑒的地方的摆尝。

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

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

二讯检、setFactory()

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

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

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

/setFactory.png

這兩個方法分別接收 Factory 和 Factory2 灸芳,它們兩個都是 Interface涝桅。并且這兩個方法的功能也是類似的。只是 setFactory2() 是在 Api Level 11 之后引入的耗绿,使用那個取決于項目的 minSdkVersion苹支。

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

/compatImpl.png

可以看到精耐,這里只對 Api Level 21 作為一個分界,去處理邏輯琅锻,其中會有不同的實現(xiàn)卦停,這里有興趣可以一探究竟,有時間會單獨出一篇文章來講解恼蓬,這里就不再深入了惊完。

這里,我們需要用到 LayoutInflaterCompat.setFactory() 方法处硬,它實際上已經(jīng)被標記為 @Deprecated 了小槐,一般推薦我們使用 LayoutInflaterCompat.setFactory2(),但是它們的功能是一致的荷辕,這里就不糾結(jié)這些細節(jié)了凿跳。

/impl-setfactory.png

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

/LayoutFactory.png

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

2.2 舉個例子

對著源碼說太干了蟆盐。下面我舉個實際的例子承边,相信就可以說明問題了。

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

/setfactory-javacode.png

再聲明一個布局富岳,讓它去顯示 layout-XML 布局蛔糯,層級很簡單,就是一個 LinearLayout 中間包含了一個 TextView窖式。

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

/setFactory-log.png

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

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

三照瘾、利用 LayoutInflater 替換字體

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

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

/demo-activitycode.png

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

/demo-delegate-code.png

其實乌妙,所有替換字體的邏輯使兔,都在 FontTextView 中,接下來我們再看看 FontTextView 的邏輯藤韵。

/fontTextView.png

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

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

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

/demo-activityxml.png

最后,我們再來看看運行后的效果。

/f-fontimage.png

四、小結(jié)

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

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

點贊或者分享吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末繁莹,一起剝皮案震驚了整個濱河市檩互,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咨演,老刑警劉巖闸昨,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薄风,居然都是意外死亡饵较,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門遭赂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來循诉,“玉大人,你說我怎么就攤上這事撇他∏衙ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵困肩,是天一觀的道長划纽。 經(jīng)常有香客問我,道長锌畸,這世上最難降的妖魔是什么勇劣? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蹋绽,結(jié)果婚禮上芭毙,老公的妹妹穿的比我還像新娘筋蓖。我一直安慰自己,他們只是感情好退敦,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布粘咖。 她就那樣靜靜地躺著,像睡著了一般侈百。 火紅的嫁衣襯著肌膚如雪瓮下。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天钝域,我揣著相機與錄音讽坏,去河邊找鬼。 笑死例证,一個胖子當著我的面吹牛路呜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播织咧,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼胀葱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笙蒙?” 一聲冷哼從身側(cè)響起抵屿,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捅位,沒想到半個月后轧葛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡艇搀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年尿扯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片中符。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡姜胖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淀散,到底是詐尸還是另有隱情右莱,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布档插,位于F島的核電站慢蜓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郭膛。R本人自食惡果不足惜晨抡,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耘柱,春花似錦如捅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至士袄,卻和暖如春悲关,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娄柳。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工寓辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赤拒。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓秫筏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挎挖。 傳聞我的和親對象是個殘疾皇子跳昼,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,365評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • 最近夜里常常疼醒 眼淚會不自覺的往下掉 雖然很疼 但也沒到忍不住想哭的程度 但就是很難過 我以為自己是個很平凡很普...
    葉大人閱讀 444評論 0 0
  • 昨天看到一句話肋乍,“ 只有在你工作堆積如山時,你才可能享受閑暇敷存。當你無事可做時墓造,空閑就變得一點也不有趣,因為空閑就是...
    Astrolover閱讀 594評論 0 1
  • 2017年11月18日 星期六 晴 今晚下班回來锚烦,吃過晚飯后觅闽,給李云哲檢查了作業(yè)。數(shù)學作業(yè)做的特別不好涮俄,本...
    云哲云燦媽媽閱讀 108評論 0 0