Android Studio 3.6中新的檢視繫結工具ViewBinding 用法詳解
前言
我們在Android開發的過程中總是需要獲取XML佈局中的ViewId,以便給其賦值進行顯示,早期我們只能使用 findViewById 這個API,會導致很多的模版程式碼出現。2013年左右Android界大神 Jake Wharton開源了Butter Knife框架,通過Bind("viewid")方式方便開發者獲取ViewId。近兩年由於谷歌對Kotlin的支援,我們開始使用 Android Kotlin extensions。 在檔案中匯入佈局檔案直接引用viewId。無需做其他額外操作,最為方便。
目前,谷歌在 Android Studio 3.6 Canary 11 及更高版本中加入了新的檢視繫結工具 ViewBinding。
下面我們一起看下具體使用。
ViewBinding的使用
我們現在開發很多專案都是使用模組化來進行開發的。ViewBinding也是很機智的可以按照模組來啟用。如果要在某個模組中啟用ViewBinding,則需要在模組的build.gradle中新增如下配置即可:
android { ... viewBinding { enabled = true } }
如果在使用的過程中開發者不想為某個佈局檔案生成binding類,則可以使用如下屬性新增到佈局的根檢視中即可:
<LinearLayout ... tools:viewBindingIgnore="true" > ... </LinearLayout>
當模組開啟檢視繫結功能後,系統會為該模組中的每一個XML檔案生成對應的繫結類。每一個繫結類均包含對根檢視以及定義了ID的所有檢視的引用。
繫結類的名稱生成規則是將XML檔案的名稱按照駝峰命名規則加上Binding進行結尾。
比如我們的 activity_main.xml檔案。
<LinearLayout ... > <TextView android:id="@+id/name" /> <ImageView android:cropToPadding="true" /> <Button android:id="@+id/button" android:background="@drawable/rounded_button" /> </LinearLayout>
那麼生產的繫結類名稱為 ActivityMainBinding。此類具有兩個欄位:一個是名為 name 的 TextView,另一個是名為 button 的 Button。該佈局中的 ImageView 沒有 ID,因此繫結類中不存在對它的引用。
每個繫結類還包含一個 getRoot() 方法,提供為佈局檔案的根檢視的直接引用。在此示例中,ActivityMainBinding 類中的 getRoot() 方法會返回 LinearLayout 根檢視。
自動生成的繫結類也並不複雜,主要就是兩個inflate過載方法以及一個bind方法。我們獲取的對viewId引用就是在bind方法中進行的,內部其實也是通過findViewById來獲取相關view的。
我們通常設定佈局檔案是通過setContentView("layoutId"),但是使用了ViewBinding後我們需要按照如下方式進行設定layout:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) //獲取name進行賦值 binding.name.text = "viewBinding" } }
這樣就可以直接使用了。是不是很簡單呢。
但是需要注意的是,如果我們的佈局檔案分為 layout和layout-land,我們我們在定義佈局的時候可能會存在不同的viewId,如果是使用findViewById 或者 Butter Knife 那麼肯定就異常了。
我們在使用 ViewBinding 的時候,繫結類貼心的為我們做了相關的判斷。通過 @Nullable 和 @NonNull 兩個註解來告訴開發者,哪些view可能為空。並在可能為空的view上添加了相關的注視說明。
/** * This binding is not available in all configurations. * <p> * Present: * <ul> * <li>layout/</li> * </ul> * * Absent: * <ul> * <li>layout-land/</li> * </ul> */ @Nullable public final TextView mAppTv;
提醒開發者在使用的時候注意異常的處理。
總結
目前 ViewBinding 的功能還不夠完善,比如XML中使用了 inClude 標籤時無法對view進行引用。但總體來說已經很不錯了。相比較於 findViewById 和 Butter Knife兩種方式還是方便很多的。而且 ViewBinding 在使用的過程中不存在型別轉換以及空指標異常的問題。因為在繫結類中已經全部定義好了。開發者直接使用就可以。和 Android Kotlin extensions 相比較我覺得都二者差不多。說不上誰更好。和databinding相比較就是資料繫結庫僅處理使用 <layout> 程式碼建立的資料繫結佈局。它具有侷限性。
目前 Jake Wharton 也在 Butter Knife開源庫中添加了如下一句話:
Attention: Development on this tool is winding down. Please consider switching to view binding in the coming months.
補充:與findViewById的區別
與使用findViewById相比,檢視繫結具有重要的優勢:
•空安全性:由於檢視繫結會建立對檢視的直接引用,因此不會因無效的檢視ID而導致空指標異常的風險。 此外,當檢視僅在佈局的某些配置中存在時,在繫結類中包含其引用的欄位將用@Nullable
•型別安全性:每個繫結類中的欄位具有與其在XML檔案中引用的檢視匹配的型別。 這意味著沒有類強制轉換異常的風險。
這些差異意味著佈局和程式碼之間的不相容性將導致編譯在編譯時而不是在執行時失敗。
與data binding 庫的區別
檢視繫結和資料繫結庫都生成可用於直接引用檢視的繫結類。 但是,有明顯的區別:
•data binding庫僅處理使用標記建立的資料繫結佈局。
•view binding不支援佈局變數或佈局表示式,因此不能用於將佈局與XML資料繫結。
到此這篇關於Android Studio 3.6中新的檢視繫結工具ViewBinding 用法詳解的文章就介紹到這了,更多相關android 檢視繫結工具ViewBinding 使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!