全新的視圖綁定工具—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中添加如下配置即可:

<code>android {/<code><code> .../<code><code> viewBinding {/<code><code> enabled = true/<code><code> }/<code><code>}/<code>

如果在使用的過程中開發者不想為某個佈局文件生成binding類,則可以使用如下屬性添加到佈局的根視圖中即可:

<code><code> .../<code><code> tools:viewBindingIgnore="true" >/<code><code> .../<code><code>/<code>

當模塊開啟視圖綁定功能後,系統會為該模塊中的每一個XML文件生成對應的綁定類。每一個綁定類均包含對根視圖以及定義了ID的所有視圖的引用。

綁定類的名稱生成規則是將XML文件的名稱按照駝峰命名規則加上Binding進行結尾。

比如我們的 activity_main.xml文件。

<code>
<code> /<code><code> /<code><code> /<code>

那麼生產的綁定類名稱為 ActivityMainBinding。此類具有兩個字段:一個是名為 name 的 TextView,另一個是名為 button 的 Button。該佈局中的 ImageView 沒有 ID,因此綁定類中不存在對它的引用。

每個綁定類還包含一個 getRoot 方法,提供為佈局文件的根視圖的直接引用。在此示例中,ActivityMainBinding 類中的 getRoot 方法會返回 LinearLayout 根視圖。

自動生成的綁定類也並不複雜,主要就是兩個inflate重載方法以及一個bind方法。我們獲取的對viewId引用就是在bind方法中進行的,內部其實也是通過findViewById來獲取相關view的。

我們通常設置佈局文件是通過setContentView("layoutId"),但是使用了ViewBinding後我們需要按照如下方式進行設置layout:

<code>class MainActivity : AppCompatActivity {/<code>
<code> override fun onCreate(savedInstanceState: Bundle?) {/<code><code> super.onCreate(savedInstanceState)/<code>
<code> val binding = ActivityMainBinding.inflate(layoutInflater)/<code><code> setContentView(binding.root)/<code><code> //獲取name進行賦值/<code><code> binding.name.text = "viewBinding"/<code><code> }/<code><code>}/<code>

這樣就可以直接使用了。是不是很簡單呢。

但是需要注意的是,如果我們的佈局文件分為 layout和layout-land,我們我們在定義佈局的時候可能會存在不同的viewId,如果是使用findViewById 或者 Butter Knife 那麼肯定就異常了。

我們在使用 ViewBinding 的時候,綁定類貼心的為我們做了相關的判斷。通過 @able 和 @Non 兩個註解來告訴開發者,哪些view可能為空。並在可能為空的view上添加了相關的注視說明。

<code> /**/<code><code> * This binding is not available in all configurations./<code><code> * 

/<code><code> * Present:/<code><code> *

    /<code><code> *
  • layout/
  • /<code><code> * /<code><code> */<code><code> * Absent:/<code><code> *
      /<code><code> *
    • layout-land/
    • /<code><code> * /<code><code> *//<code><code> @able/<code><code> public final TextView mAppTv;/<code>

提醒開發者在使用的時候注意異常的處理。

總結

目前 ViewBinding 的功能還不夠完善,比如XML中使用了 inClude 標籤時無法對view進行引用。但總體來說已經很不錯了。相比較於 findViewById 和 Butter Knife兩種方式還是方便很多的。而且 ViewBinding 在使用的過程中不存在類型轉換以及空指針異常的問題。因為在綁定類中已經全部定義好了。開發者直接使用就可以。和 Android Kotlin extensions 相比較我覺得都二者差不多。說不上誰更好。和databinding相比較就是數據綁定庫僅處理使用 代碼創建的數據綁定佈局。它具有侷限性。

目前 Jake Wharton 也在 Butter Knife開源庫中添加了如下一句話:

Attention: Development on this tool is winding down. Please consider switching to view binding in the coming months.

想必 ViewBinding 在未來的地位和作用將不言而喻了吧。


分享到:


相關文章: