1. 程式人生 > 程式設計 >Android 使用View Binding的方法詳解

Android 使用View Binding的方法詳解

前言

Android Studio穩定版釋出了3.6版本,帶來了一些新變化:首先外觀,啟動頁變了,logo改了,更顯現代化;增加Multi Preview功能,能同時預覽多個尺寸螢幕的顯示效果;模擬器支援多屏;也終於支援全新的檢視繫結元件View Binding;等。

之前我們與檢視互動的方式有findViewById、kotlin中引入Android Kotlin Extensions後直接通過id進行訪問。前者模板化嚴重,重複程式碼多;後者最為方便。現在有了新的選擇–View Binding,官方解釋:

通過檢視繫結功能,您可以更輕鬆地編寫可與檢視互動的程式碼。在模組中啟用檢視繫結之後,系統會為該模組中的每個 XML 佈局檔案生成一個繫結類。繫結類的例項包含對在相應佈局中具有 ID 的所有檢視的直接引用。

在大多數情況下,檢視繫結會替代 findViewById。

使用

View Binding可按模組啟用。要在某個模組中啟用,在該模組的build.gradle中新增如下配置:

android {
  ...
  viewBinding {
   enabled = true
  }
 }

用法

當某個模組啟用View Binding後,系統會為該模組中包含的每個 XML 佈局檔案各生成一個繫結類。每個繫結類均包含對根檢視以及具有id 的所有檢視的引用。繫結類的類名是xml的名稱後面加“Binding”。

例如,假設某個佈局檔名為 比如activity_main.xml:

<LinearLayout ... >
  <TextView android:id="@+id/tvName" />
  <TextView android:text="no id"/>
  <Button android:id="@+id/btnOpen"/>
</LinearLayout>

那麼生成的繫結類類名是ActivityMainBinding。這個類有兩個成員變數tvName和btnOpen,還包含一個getRoot()方法,返回根檢視,此例中返回LinearLayout。

要獲取繫結類的例項,可以通過靜態 inflate() 方法。

private lateinit var binding: ActivityMainBinding

@Override
fun onCreate(savedInstanceState: Bundle) {
 super.onCreate(savedInstanceState)
 binding = ActivityMainBinding.inflate(inflater)
 setContentView(binding.root)
}

現在,繫結類的例項可用於引用任何檢視:

binding.tvName = "name"
binding.btnOpen.setOnClickListener{
 Log.d(TAG,"btnOpen click")
}

區別

  • 與findViewById的區別:空安全和型別安全,不存在因引用了一個錯誤的id而導致的空指標異常或者型別轉換異常。
  • 與databinding的區別:databinding僅處理使用 <layout> 程式碼建立的資料繫結佈局;View Binding不支援佈局變數或佈局表示式,因此它不能用於在xml中將佈局與資料繫結。
  • 與Android Kotlin Extensions的區別:在使用上,後者簡單粗暴,直接id進行訪問,而View Binding需要建立繫結類的例項;後者有一些不友好的地方,比如相同的id存在於多個xml,容易導錯包,如果包導錯了,會有可能別的View用錯id導致空指標,而View Binding顯然不會有這種情況。

總結

如果與findViewById或者其他View注入框架進行選擇,建議選擇View Binding,程式碼更為簡潔和安全。

如果是使用databinding的專案,可以使用View Binding作為補充,用來處理非<layout>為根標籤的xml。(ps:貌似不可能出現這種場景?也應該避免這種場景,畢竟類生成過多會影響build速度和增加安裝包體積)

與Android Kotlin Extensions進行選擇,目前來看,無最優解,二者都很好,取決於開發者是想開發效率最大化、程式碼簡潔使用方便(Android Kotlin Extensions)還是傾向於穩健、出錯機率最小化(View Binding)。

By the way,View Binding目前還不支援include標籤引入的xml。View Binding功能的完善、在未來的地位和作用、以及能否超越Android Kotlin Extensions,我們仍需持續關注其後續版本。

到此這篇關於Android 使用View Binding的方法詳解的文章就介紹到這了,更多相關android View Binding使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!