前言
我們每個項目都會用到findview,那么原生的findViewById是最基礎(chǔ)的實現(xiàn)方式,自然也存在著大量重復(fù)代碼,影響開發(fā)效率等各種問題,隨著技術(shù)的發(fā)展,也出現(xiàn)了很多替代原生findview的技術(shù)方案,比如ButterKnife,ViewBinding,DataBinding,Kotlin android Extensions等等,雖然現(xiàn)在無法哪種方案最后都是通過findViewById來實現(xiàn),但是以現(xiàn)在讀取xml布局來獲取view的大前提下,短時間內(nèi)還是無法繞開findViewById這一方式的,也許將來我們不在使用xml或許會有更高效的方式實現(xiàn)findview。那么現(xiàn)階段哪一種會是我們更青睞的方案呢,看完這篇文章,相信自然會有答案。
1.ButterKnife
github地址:https://github.com/JakeWharton/butterknife
ButterKnife在2013年一出現(xiàn)就迅速被廣大Android開發(fā)者所追隨,因為它簡潔的書寫方式大大減少了開發(fā)者的重復(fù)性勞動,一只持續(xù)到組件化開發(fā)的流行,在Android項目的library模塊中,生成R類中的成員變量就已經(jīng)改為了非final修飾,這一改變直接致使ButterKnife無法在Android項目的library模塊中使用,為了能夠讓ButterKnife運(yùn)行在library模塊,ButterKnife的作者通過生成R2類讓ButterKnife在library模塊中繼續(xù)使用,雖然這樣也能使用,但是也帶來了很多其他的問題,每個library模塊會存在兩個R文件,R2的id還會經(jīng)常找不到等等,最后作者也不得不發(fā)出聲明,此工具以被棄用,功能開發(fā)和一般錯誤也會停止維護(hù)。引用一下作者的原文:
Attention: This tool is now deprecated. Please switch to view binding. Existing versions will continue to work, obviously, but only critical bug fixes for integration with AGP will be considered. Feature development and general bug fixes have stopped.
2.DataBinding
DataBinding是Google官方在2015年谷歌I/O大會上發(fā)布的一個數(shù)據(jù)綁定框架,它并非專為findView而生,而是作為MVVM架構(gòu)的雙向綁定數(shù)據(jù)的工具。findView的功能只是DataBinding的其中一個小功能。
開發(fā)者一般會在MVVM架構(gòu)的項目中使用DataBinding來獲取View。但是它使用起來也有很多問題,比如必須修改xml的結(jié)構(gòu),而且很多時候需要手動build才能生成DataBinding相關(guān)類。介于這些問題,DataBinding不是findview很好的方案。
3.Kotlin Android Extensions
2017年Google I/O開發(fā)者大會中,Google宣布Kotlin成為Android開發(fā)的一級語言,之后kotlin發(fā)展迅猛。而JetBrain推出的Kotlin Android Extension(以下簡稱KAE)插件成為了最為簡潔的獲取View的方法,簡潔到無需任何代碼,直接通過id作為View使用。這一功能在我剛一接觸時,簡直欣喜非常,心想再也不用寫繁瑣無用的代碼了。
但這一方案也有本身的局限性。它存在以下幾個缺點:
類型安全:res下的任何id都可以被訪問,有可能因訪問了非當(dāng)前Layout下的id而出錯
空安全:這主要體現(xiàn)在Configuration中的對應(yīng)布局不全時,運(yùn)行時可能出現(xiàn)NPE
兼容性:只能在kotlin中使用,java不友好
局限性:不能跨module使用
正是這幾個缺點導(dǎo)致了KAE的接受度持續(xù)降低,隨著Google對ViewBinding的大力推廣,KAE最終也放棄爭取---Jetbrains在官網(wǎng)宣布廢棄KAE,并推薦開發(fā)者使用ViewBinding.
4.ViewBinding
以上幾種findView方案都已經(jīng)不再被推薦,最后只剩Google官方正在大力推廣的ViewBinding組件。ViewBinding是Google在2019年I/O大會上公布的一款A(yù)ndroid視圖綁定工具。它的使用方式有點類似DataBinding,但相比DataBinding,ViewBinding是一個更輕量級、更純粹的findViewById的替代方案。它具有以下幾個優(yōu)點:
類型安全: ViewBinding會基于布局中的View生成類型正確的屬性。比如,在布局中放入了一個 TextView ,視圖綁定就會暴露出一個 TextView 類型的屬性供開發(fā)中使用。
空安全:ViewBinding會檢測某個視圖是不是只在一些配置下存在,并依據(jù)結(jié)果生成帶有 @Nullable 注解的屬性。所以即使在多種配置下定義的布局文件,視圖綁定依然能夠保證空安全。
ViewBinding生成的綁定類是一個Java類,并且添加了Kotlin的注解,可以很好的支持 Java 和 Kotlin 兩種編程語言。
至此我們已經(jīng)知道,viewbinding才是當(dāng)前findview的最優(yōu)選擇。
具體使用用法也很簡單,附官網(wǎng)文檔:https://developer.android.com/topic/libraries/view-binding#data-binding