原文地址??https://blog.csdn.net/fly_with_24/article/details/104337067
以下內(nèi)容為筆者記錄閱讀

谷歌在2019 I/O 大會中的?What’s New in Architecture Components?介紹了?view binding
在?What’s New in Architecture Components?中,有一個簡短的關(guān)于view binding 的演講,演講中將 view binding 與現(xiàn)有解決方案進行了比較,并進一步討論了為什么view binding 比?data binding?或?Kotlin synthetics?等現(xiàn)有解決方案更好。
對我而言,Kotlin synthetics?運行良好,但是沒有編譯時的安全性,這意味著所有 ID 都位于全局命名空間中。因此,如果您使用的 ID 具有相同的名稱,并且從錯誤的布局導(dǎo)入 ID, 由于ID不是當(dāng)前布局的一部分,導(dǎo)致崩潰,除非您將應(yīng)用程序運行到該布局,否則無法提前知道這一點。
這篇文章很好地概述了?Kotlin synthetics?的問題
The Argument Over Kotlin Synthetics
View Binding?將在 Android Studio 3.6 穩(wěn)定版中提供(譯者注:當(dāng)前Android Studio穩(wěn)定版版本為3.5.3),如果您想要使用它,您可以下載 Android Studio 3.6 RC3 或者 Android Studio 4.0 Canary 9
view binding 的主要優(yōu)點是所有綁定類都是由Gradle插件生成的,因此它對構(gòu)建時間沒有影響,并且具有編譯時安全性(我們將在示例中看到)。
首先,啟用 view binding, 我們需要在 module 的build.gradle文件中添加以下內(nèi)容:

注意:視圖綁定是逐模塊啟用的,因此,如果您具有多模塊項目設(shè)置,則需要在每個?build.gradle?文件中添加以上代碼。
如果要在特定的布局禁用 view binding,則需要在布局文件的根視圖中添加?tools:viewBindingIgnore = “true”。
啟用后,我們可以立即開始使用它,并且當(dāng)您完成同步 build.gradle 文件時,默認情況下會生成所有綁定類。
它通過將XML布局文件名轉(zhuǎn)換為駝峰式大小寫并在其末尾添加?Binding?來生成綁定類。 例如,如果您的布局文件名為?activity_splash,則它將生成綁定類為?ActivitySplashBinding。
如何使用它?
activity 中使用

我們有一個名為?activity_splash?的布局文件,里面有一個ID為?tvVersionName?的?TextView?,因此在使用view binding 時,我們要做的就是獲取綁定類的引用,例如:

在?setContentView()?方法中使用?getRoot()?,該方法將返回布局的根布局。可以從我們創(chuàng)建的綁定類對象訪問視圖,并且可以在創(chuàng)建對象后立即使用它,如下所示:

在這里,綁定類知道?tvVersionName?是TextView,因此我們不必擔(dān)心類型轉(zhuǎn)換。
fragment 中使用

在 fragment 中,使用 view binding 有些不同。 我們需要傳遞?LayoutInflator,ViewGroup和一個?attachToRoot?布爾變量,這些變量是通過覆蓋?onCreateView?獲得的。
我們可以通過調(diào)用?binding.root?返回 view。您還注意到,我們使用了兩個不同的變量?binding?和?_binding,并且?_binding?變量在?onDestroyView()?中設(shè)置為null。
這是因為該 fragment 的生命周期與 activity 的生命周期不同,并且該fragment 可以超出其視圖的生命周期,因此如果不將其設(shè)置為null,則可能會發(fā)生內(nèi)存泄漏。
另一個變量通過?!!?使一個變量為可空值而使另一個變量為非空值避免了空檢查。 。
在 RecyclerView adapter 中使用

row_payment.xml?是我們用于?RecyclerView?item 的布局文件,對應(yīng)生成的綁定類?RowPaymentBinding。
現(xiàn)在,我們所需要做的就是在onCreateViewHolder()?中調(diào)用?inflate()?方法生成?RowPaymentBinding?對象并傳遞到?PaymentHolder?主構(gòu)造器中,并將?itemBinding.root?傳遞給?RecyclerView .ViewHolder()?構(gòu)造函數(shù)。
處理<include>標簽
view binding 可以與?<include>?標簽一起使用。 布局中通常包含兩種?<include>?標簽,帶或不帶<merge>?標簽。
<inlude>?不帶?<merge>標簽
我們需要為<include>?分配一個 ID,然后使用該 ID 來訪問包含布局中的視圖。讓我們來看一個例子。
app_bar.xml

main_layout.xml

在上面的代碼中,我們在布局文件中包括了一個通用工具欄,<include>?有一個?android:id=“@+id/appbar”?ID,我們將使用它從?app_bar.xml?中訪問工具欄并將其設(shè)置為我們的?action bar。

<inlude>?帶?<merge>標簽
當(dāng)在一個布局中包含另一個布局時,我們通常使用一個帶有?<merge>?標記的布局,這有助于消除布局嵌套。
placeholder.xml

fragment_order.xml

如果我們嘗試為該?<include>?提供ID,view binding 不會在綁定類中生成ID,因此我們無法像使用普通?include?那樣訪問視圖。
在這種情況下,我們有?PlaceholderBinding,它是?placeholder.xml(<merge>?布局文件)的自動生成的類。我們可以調(diào)用其bind()方法并傳遞包含它的布局的根視圖。

然后,我們可以從我們的類(如?placeholderBinding.tvPlaceholder.text)訪問?placeholder.xml?內(nèi)部的視圖。
感謝閱讀。希望收到您的評論。
Android Developer docs — view binding
以上內(nèi)容轉(zhuǎn)載于?https://blog.csdn.net/fly_with_24/article/details/104337067?
僅作為筆者閱讀使用