最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Android技術(shù)知識(shí)點(diǎn):如何使用視圖綁定來(lái)消除findViewById()

2022-07-22 08:19 作者:未來(lái)碼匠  | 我要投稿

遇到問(wèn)題

每次在創(chuàng)建或重新創(chuàng)建視圖后使用findViewById()函數(shù)來(lái)獲取對(duì)它的引用時(shí),Android 系統(tǒng)都會(huì)在運(yùn)行時(shí)遍歷視圖層次結(jié)構(gòu)來(lái)查找它。當(dāng)您的應(yīng)用只有少數(shù)視圖時(shí),這不是問(wèn)題。然而,生產(chǎn)應(yīng)用程序可能在一個(gè)布局中有幾十個(gè)視圖,即使有最好的設(shè)計(jì),也會(huì)有嵌套的視圖。

考慮一個(gè)包含滾動(dòng)視圖的線性布局,該滾動(dòng)視圖包含一個(gè)文本視圖。對(duì)于較大或較深的視圖層次結(jié)構(gòu),查找視圖可能需要足夠的時(shí)間,從而明顯降低用戶的應(yīng)用程序速度。在變量中緩存視圖會(huì)有所幫助,但您仍然必須在每個(gè)命名空間中為每個(gè)視圖初始化一個(gè)變量。有了很多視圖(View)和多個(gè)活動(dòng)(Activity),這些都累加在一起,這樣會(huì)導(dǎo)致增加重復(fù)代碼,降低項(xiàng)目可維護(hù)性,即所有開(kāi)發(fā)人員的技術(shù)痛點(diǎn)。

技術(shù)方案

通過(guò)視圖綁定功能,您可以更輕松地編寫(xiě)可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會(huì)為該模塊中的每個(gè) XML 布局文件生成一個(gè)綁定類。綁定類的實(shí)例包含對(duì)在相應(yīng)布局中具有 ID 的所有視圖的直接引用。

在大多數(shù)情況下,視圖綁定會(huì)替代 findViewById。

在此任務(wù)中,您將設(shè)置視圖綁定,并使用視圖綁定將對(duì)findViewById()的調(diào)用替換為對(duì)視圖綁定的調(diào)用。

操作步驟

第 1 步:?jiǎn)⒂靡晥D綁定

要使用視圖綁定,您需要在 Gradle 文件中啟用視圖綁定,因?yàn)槟J(rèn)情況下未啟用。這是因?yàn)橐晥D綁定會(huì)增加編譯時(shí)間并可能影響應(yīng)用程序啟動(dòng)時(shí)間。

?1.打開(kāi)build.gradle (Module: 項(xiàng)目名.app)文件,如下圖所示:

2.要在android模塊內(nèi)啟用視圖綁定。

「舊版本」設(shè)置viewBinding元素內(nèi)的enabled屬性為true,代碼如下:

「新版本」上面是Kotlin Android擴(kuò)展功能的,該功能已廢棄,這意味著不再支持使用 Kotlin 合成器進(jìn)行視圖綁定。如果您的應(yīng)用使用 Kotlin 合成器進(jìn)行視圖綁定,請(qǐng)遷移到 Jetpack 視圖綁定,代碼如下:

3.如果您的應(yīng)用程序不使用Parcelize功能,請(qǐng)刪除啟用Kotlin Android擴(kuò)展的行,代碼如下:

4.如果您的應(yīng)用程序使用Parcelize功能,請(qǐng)切換到使用獨(dú)立的「kotlin-parcelize」Gradle插件,該插件提供了一個(gè) Parcelable 實(shí)現(xiàn)生成器,代碼如下:

5.出現(xiàn)同步項(xiàng)目的提示時(shí),點(diǎn)擊「立刻同步(Sync Now)」,如果沒(méi)有提示,請(qǐng)依次執(zhí)行「文件(File)> 使用Gradle文件來(lái)同步項(xiàng)目(Sync Project with Gradle Files)」操作,或直接點(diǎn)擊工具欄右側(cè)的Gradle圖標(biāo),如下圖所示:

第 2 步:更改布局文件以用于視圖綁定

為某個(gè)模塊啟用視圖綁定功能后,系統(tǒng)會(huì)為該模塊中包含的每個(gè) XML 布局文件生成一個(gè)綁定類。每個(gè)綁定類均包含對(duì)根視圖以及具有 ID 的所有視圖的引用。

1.打開(kāi)activity_main.xml文件,并切換到「代碼(Code)」選項(xiàng)卡,如下圖所示:

2.將之前的<ConstraintLayout>標(biāo)簽替換為<LinearLayout>標(biāo)簽,并去掉無(wú)必要的部分代碼,代碼如下:

?「小知識(shí)」

依次執(zhí)行「代碼(Code) > 重新格式化代碼(Reformat Code)」操作,修復(fù)代碼縮進(jìn)即可,如下圖所示:

3.如果您希望在生成綁定類時(shí)忽略某個(gè)布局文件,請(qǐng)將 tools:viewBindingIgnore="true" 屬性添加到相應(yīng)布局文件的根視圖中,代碼如下:


第 3 步:在MainActivity類中創(chuàng)建綁定對(duì)象

將綁定對(duì)象的引用添加到MainActivity類內(nèi),以便您可以使用它來(lái)訪問(wèn)視圖。

1.打開(kāi)MainActivity.kt或MainActivity.java文件,代碼如下:

?Kotlin

Java

2.在onCreate()方法上為綁定對(duì)象創(chuàng)建一個(gè)變量。該變量通常稱為binding。系統(tǒng)會(huì)通過(guò)以下方式生成綁定類的名稱:將指定的XML 文件名轉(zhuǎn)換為駝峰式大小寫(xiě),并在末尾添加「Binding」一詞。

流程思路,如下圖所示:

「小知識(shí)」

小駝峰式命名法(lower camel case):第一個(gè)單字以小寫(xiě)字母開(kāi)始,第二個(gè)單字的首字母大寫(xiě)。例如:firstName、lastName。
大駝峰式命名法(upper camel case):每一個(gè)單字的首字母都采用大寫(xiě)字母,例如:FirstName、LastName、CamelCase。

示例代碼,如下:

3.點(diǎn)擊ActivityMainBinding,并按下「Alt+Enter(Win版)或Option+Enter(Mac版)」組合鍵,導(dǎo)入這個(gè)缺失的類即可。

導(dǎo)入前,提示「導(dǎo)入ActivityMainBinding」,如下圖所示:

?Kotlin

Java

導(dǎo)入后,添加相關(guān)的import語(yǔ)句,代碼如下:

第 4?步:在MainActivity類中使用視圖綁定

如需設(shè)置綁定類的實(shí)例以供MainActivity類使用,請(qǐng)?jiān)贛ainActivity類的 onCreate() 方法中執(zhí)行以下步驟:

1.調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法,即此操作會(huì)創(chuàng)建該綁定類的實(shí)例以供MainActivity類使用,代碼如下:

?Kotlin

Java

2.通過(guò)調(diào)用 getRoot() 方法或使用 Kotlin 屬性語(yǔ)法獲取對(duì)根視圖的引用,即會(huì)返回 LinearLayout 根視圖,代碼如下:

??Kotlin

Java

3.將根視圖傳遞到 setContentView(),使其成為屏幕上的Activity視圖,代碼如下:

?Kotlin

Java

第 5?步:使用綁定對(duì)象替換對(duì)findViewById()的所有調(diào)用

現(xiàn)在可以將對(duì)綁定對(duì)象中視圖的引用替換為對(duì)findViewById()的所有調(diào)用。創(chuàng)建綁定對(duì)象時(shí),編譯器從從布局中視圖的ID生成綁定對(duì)象中視圖的名稱。例如,按鈕的id屬性值是user_btn,和綁定對(duì)象中的userBtn一樣。

在onCreate()中,將findViewById()替換為引用綁定對(duì)象中的ID屬性值「注意:以小駝峰式命名法(lower camel case)為準(zhǔn)」。將findViewById<Button>(R.id.btn)替換為binding.btn,并添加要執(zhí)行的操作代碼,代碼如下:

Kotlin

Java

提示

如果您在進(jìn)行更改后看到編譯器錯(cuò)誤,請(qǐng)選擇「構(gòu)建(Build) > 清理項(xiàng)目(Clean Project)」 ,然后選擇「構(gòu)建(Build)> 重構(gòu)項(xiàng)目(Rebuild Project)」。這樣做通常會(huì)更新生成的文件。否則,選擇「文件(File) > 項(xiàng)目無(wú)效時(shí)緩存或重新啟動(dòng)(Invalidate Caches/Restart)」進(jìn)行更徹底的清理。

您之前了解Resources保存對(duì)應(yīng)用程序中所有資源的引用的對(duì)象。在引用視圖時(shí),您可以Binding以類似的方式考慮對(duì)象;但是,該Binding對(duì)象要復(fù)雜得多。

運(yùn)行效果

下載源碼

Android技術(shù)知識(shí)點(diǎn):如何使用視圖綁定來(lái)消除findViewById()

https://download.csdn.net/download/qq_29901385/86247662]

與 findViewById 的區(qū)別

與使用 findViewById 相比,視圖綁定具有一些很顯著的優(yōu)點(diǎn):

  • Null 安全:由于視圖綁定會(huì)創(chuàng)建對(duì)視圖的直接引用,因此不存在因視圖 ID 無(wú)效而引發(fā) Null 指針異常的風(fēng)險(xiǎn)。此外,如果視圖僅出現(xiàn)在布局的某些配置中,則綁定類中包含其引用的字段會(huì)使用 @Nullable 標(biāo)記。

  • 類型安全:每個(gè)綁定類中的字段均具有與它們?cè)?XML 文件中引用的視圖相匹配的類型。這意味著不存在發(fā)生類轉(zhuǎn)換異常的風(fēng)險(xiǎn)。

這些差異意味著布局和代碼之間的不兼容將會(huì)導(dǎo)致構(gòu)建在編譯時(shí)(而非運(yùn)行時(shí))失敗。

與數(shù)據(jù)綁定的對(duì)比

視圖綁定和數(shù)據(jù)綁定均會(huì)生成可用于直接引用視圖的綁定類。但是,視圖綁定旨在處理更簡(jiǎn)單的用例,與數(shù)據(jù)綁定相比,具有以下優(yōu)勢(shì):

  • 更快的編譯速度:視圖綁定不需要處理注釋,因此編譯時(shí)間更短。

  • 易于使用:視圖綁定不需要特別標(biāo)記的 XML 布局文件,因此在應(yīng)用中采用速度更快。在模塊中啟用視圖綁定后,它會(huì)自動(dòng)應(yīng)用于該模塊的所有布局。

反過(guò)來(lái),與數(shù)據(jù)綁定相比,視圖綁定也具有以下限制:

  • 視圖綁定不支持布局變量或布局表達(dá)式,因此不能用于直接在 XML 布局文件中聲明動(dòng)態(tài)界面內(nèi)容。

  • 視圖綁定不支持雙向數(shù)據(jù)綁定。

考慮到這些因素,在某些情況下,最好在項(xiàng)目中同時(shí)使用視圖綁定和數(shù)據(jù)綁定。您可以在需要高級(jí)功能的布局中使用數(shù)據(jù)綁定,而在不需要高級(jí)功能的布局中使用視圖綁定。

總結(jié)

使用數(shù)據(jù)綁定替換對(duì)findViewById()的調(diào)用的步驟:

1.在build.gradle (Module: 項(xiàng)目名.app)文件的android模塊內(nèi)啟用視圖綁定:buildFeatures { viewBinding true }
2.在XML布局中使用任何視圖作為根視圖。
3.定義綁定變量:private lateinit var binding:ActivityMainBinding(Kotlin) 或?ActivityMainBinding?binding;(Java)
4.在MainActivity類內(nèi)創(chuàng)建綁定對(duì)象,將setContentView(R.layout.activity_main)替換為如下的代碼:

5.用對(duì)綁定對(duì)象中視圖ID屬性值的引用替換對(duì)findViewById()的調(diào)用。例如:findViewById<Button>(R.id.btn) =>??binding.btn,即在本例中,視圖名是XML文件中的視圖ID屬性值「注意:以小駝峰式命名法(lower camel case)為準(zhǔn)」。

實(shí)踐出真知,鉆研出智慧。不管有多難,不顧一切,保持一顆智勇的心,靜心鉆研,分析問(wèn)題,思維嚴(yán)密,尋找和抓住突破口,到時(shí)候才能解決問(wèn)題??朔y題,就得有耐心,不然無(wú)法挑戰(zhàn)自我,突破極限。

到這里為止,歡迎大神們隨便吐槽我所寫(xiě)的技術(shù)文章,抓住我的痛點(diǎn),請(qǐng)獻(xiàn)上最寶貴的最佳的技術(shù)方案吧。放心吧,我不會(huì)復(fù)仇大家,因?yàn)榇蠹矣肋h(yuǎn)都是我最好的導(dǎo)師。若大家對(duì)此有疑惑的地方,就能找我討論一下,開(kāi)闊眼界,增長(zhǎng)見(jiàn)識(shí)。我希望得到大家的鼓勵(lì)和點(diǎn)贊,將是我創(chuàng)作的最大動(dòng)力。

作者聲明

本篇經(jīng)驗(yàn)系本人依照真實(shí)經(jīng)歷原創(chuàng),需要轉(zhuǎn)載到博客、自媒體平臺(tái)、技術(shù)網(wǎng)站等,未經(jīng)許可,嚴(yán)格遵守本人的知識(shí)版權(quán),謝絕轉(zhuǎn)載。如想轉(zhuǎn)載,請(qǐng)聯(lián)系本人授權(quán)。

聯(lián)系郵箱:3403978592@qq.com

微信號(hào):X9267543839

QQ:3403978592



Android技術(shù)知識(shí)點(diǎn):如何使用視圖綁定來(lái)消除findViewById()的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
武安市| 黔西| 肇源县| 木兰县| 闽清县| 上栗县| 鹿邑县| 仁布县| 合水县| 惠东县| 哈密市| 江都市| 祁阳县| 綦江县| 牟定县| 南投县| 秦安县| 伊宁市| 新竹市| 吉林市| 锦屏县| 定结县| 德保县| 辉县市| 阿尔山市| 钟山县| 莲花县| 防城港市| 青川县| 休宁县| 鄂州市| 松潘县| 邓州市| 柳林县| 松江区| 济南市| 濮阳县| 柞水县| 昌都县| 灌南县| 南丰县|