Android 使用View Binding的方法詳解
前言
Android Studio穩(wěn)定版發(fā)布了3.6版本,帶來了一些新變化:首先外觀,啟動(dòng)頁變了,logo改了,更顯現(xiàn)代化;增加Multi Preview功能,能同時(shí)預(yù)覽多個(gè)尺寸屏幕的顯示效果;模擬器支持多屏;也終于支持全新的視圖綁定組件View Binding;等。
之前我們與視圖交互的方式有findViewById、kotlin中引入Android Kotlin Extensions后直接通過id進(jìn)行訪問。前者模板化嚴(yán)重,重復(fù)代碼多;后者最為方便?,F(xiàn)在有了新的選擇–View Binding,官方解釋:
通過視圖綁定功能,您可以更輕松地編寫可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會(huì)為該模塊中的每個(gè) XML 布局文件生成一個(gè)綁定類。綁定類的實(shí)例包含對在相應(yīng)布局中具有 ID 的所有視圖的直接引用。
在大多數(shù)情況下,視圖綁定會(huì)替代 findViewById。
使用
View Binding可按模塊啟用。要在某個(gè)模塊中啟用,在該模塊的build.gradle中添加如下配置:
android { ... viewBinding { enabled = true } }
用法
當(dāng)某個(gè)模塊啟用View Binding后,系統(tǒng)會(huì)為該模塊中包含的每個(gè) XML 布局文件各生成一個(gè)綁定類。每個(gè)綁定類均包含對根視圖以及具有id 的所有視圖的引用。綁定類的類名是xml的名稱后面加“Binding”。
例如,假設(shè)某個(gè)布局文件名為 比如activity_main.xml:
<LinearLayout ... > <TextView android:id="@+id/tvName" /> <TextView android:text="no id"/> <Button android:id="@+id/btnOpen"/> </LinearLayout>
那么生成的綁定類類名是ActivityMainBinding。這個(gè)類有兩個(gè)成員變量tvName和btnOpen,還包含一個(gè)getRoot()方法,返回根視圖,此例中返回LinearLayout。
要獲取綁定類的實(shí)例,可以通過靜態(tài) inflate() 方法。
private lateinit var binding: ActivityMainBinding @Override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(inflater) setContentView(binding.root) }
現(xiàn)在,綁定類的實(shí)例可用于引用任何視圖:
binding.tvName = "name" binding.btnOpen.setOnClickListener{ Log.d(TAG,"btnOpen click") }
區(qū)別
- 與findViewById的區(qū)別:空安全和類型安全,不存在因引用了一個(gè)錯(cuò)誤的id而導(dǎo)致的空指針異常或者類型轉(zhuǎn)換異常。
- 與databinding的區(qū)別:databinding僅處理使用 <layout> 代碼創(chuàng)建的數(shù)據(jù)綁定布局;View Binding不支持布局變量或布局表達(dá)式,因此它不能用于在xml中將布局與數(shù)據(jù)綁定。
- 與Android Kotlin Extensions的區(qū)別:在使用上,后者簡單粗暴,直接id進(jìn)行訪問,而View Binding需要?jiǎng)?chuàng)建綁定類的實(shí)例;后者有一些不友好的地方,比如相同的id存在于多個(gè)xml,容易導(dǎo)錯(cuò)包,如果包導(dǎo)錯(cuò)了,會(huì)有可能別的View用錯(cuò)id導(dǎo)致空指針,而View Binding顯然不會(huì)有這種情況。
總結(jié)
如果與findViewById或者其他View注入框架進(jìn)行選擇,建議選擇View Binding,代碼更為簡潔和安全。
如果是使用databinding的項(xiàng)目,可以使用View Binding作為補(bǔ)充,用來處理非<layout>為根標(biāo)簽的xml。(ps:貌似不可能出現(xiàn)這種場景?也應(yīng)該避免這種場景,畢竟類生成過多會(huì)影響build速度和增加安裝包體積)
與Android Kotlin Extensions進(jìn)行選擇,目前來看,無最優(yōu)解,二者都很好,取決于開發(fā)者是想開發(fā)效率最大化、代碼簡潔使用方便(Android Kotlin Extensions)還是傾向于穩(wěn)健、出錯(cuò)幾率最小化(View Binding)。
By the way,View Binding目前還不支持include標(biāo)簽引入的xml。View Binding功能的完善、在未來的地位和作用、以及能否超越Android Kotlin Extensions,我們?nèi)孕璩掷m(xù)關(guān)注其后續(xù)版本。
到此這篇關(guān)于Android 使用View Binding的方法詳解的文章就介紹到這了,更多相關(guān)android View Binding使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)系統(tǒng)狀態(tài)欄的隱藏和顯示功能
這篇文章主要介紹了Android實(shí)現(xiàn)系統(tǒng)狀態(tài)欄的隱藏和顯示功能,文中還給大家?guī)硭姆N方法,大家可以根據(jù)自己需要參考下2018-07-07Activit跳轉(zhuǎn)動(dòng)畫之界面上某個(gè)位置并裂開上下拉伸動(dòng)畫跳轉(zhuǎn)
這篇文章主要介紹了Activit跳轉(zhuǎn)動(dòng)畫之界面上某個(gè)位置并裂開上下拉伸動(dòng)畫跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2016-07-07android實(shí)現(xiàn)簡單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09android連續(xù)拖動(dòng)導(dǎo)致掛起的解決方法
本文給大家分享的是在安卓的項(xiàng)目開發(fā)中遇到連續(xù)拖動(dòng)對象,導(dǎo)致掛起的問題的解決方法,也是經(jīng)過很多網(wǎng)友的提示,最終才找到解決方法,這里記錄一下,分享給大家。2015-05-05Android Shader應(yīng)用開發(fā)之雷達(dá)掃描效果
這篇文章主要為大家詳細(xì)介紹了Android Shader應(yīng)用開發(fā)之雷達(dá)掃描效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android自定義帶加載動(dòng)畫效果的環(huán)狀進(jìn)度條
這篇文章主要介紹了Android自定義帶加載動(dòng)畫效果的環(huán)狀進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android中Java根據(jù)文件頭獲取文件類型的方法
這篇文章主要介紹了Android中Java根據(jù)文件頭獲取文件類型的方法,涉及Android針對文件屬性的相關(guān)操作技巧,需要的朋友可以參考下2016-08-08