全新的視圖綁定工具 — ViewBinding 使用指南

本文首發於微信公衆號「Android開發之旅」,歡迎關注 ,獲取更多技術乾貨

前言

咱們在Android開發的過程當中老是須要獲取XML佈局中的ViewId,以便給其賦值進行顯示,早期咱們只能使用 findViewById 這個API,會致使不少的模版代碼出現。2013年左右Android界大神 Jake Wharton開源了Butter Knife框架,經過Bind("viewid")方式方便開發者獲取ViewId。近兩年因爲谷歌對Kotlin的支持,咱們開始使用 Android Kotlin extensions。 在文件中導入佈局文件直接引用viewId。無需作其餘額外操做,最爲方便。android

目前,谷歌在 Android Studio 3.6 Canary 11 及更高版本中加入了新的視圖綁定工具 ViewBinding。微信

下面咱們一塊兒看下具體使用。框架

使用ViewBinding

咱們如今開發不少項目都是使用模塊化來進行開發的。ViewBinding也是很機智的能夠按照模塊來啓用。若是要在某個模塊中啓用ViewBinding,則須要在模塊的build.gradle中添加以下配置便可:ide

android {
    
    ...
    
    viewBinding {
        enabled = true
    }

}

若是在使用的過程當中開發者不想爲某個佈局文件生成binding類,則可使用以下屬性添加到佈局的根視圖中便可:模塊化

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

當模塊開啓視圖綁定功能後,系統會爲該模塊中的每個XML文件生成對應的綁定類。每個綁定類均包含對跟視圖以及定義了ID的全部視圖的引用。工具

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

好比咱們的 activity_main.xml文件。gradle

<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,所以綁定類中不存在對它的引用。ui

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

自動生成的綁定類也並不複雜,主要就是兩個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.

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

掃描下方二維碼關注公衆號,獲取更多技術乾貨。

二維碼.jpg

相關文章
相關標籤/搜索