【Android APP 開發教學】元件綁定 View Binding
前言
新版 kotlin 1.4.2 官方正式宣布廢棄 Kotlin Android Extension (KAE)。過往使用 KAE 最大好處,就是可以透過 synthetic 少打定義和 findViewById。但實際這樣使用,其實延伸出不少問題。後來 KT 也沒貪這便宜,還是乖乖照寫 findViewById 或使用 View Binding。目前有使用 KAE 專案的同學,自已在斟酌一下,免得未來某一天 ,升級上來要補一大堆 Code。
附帶一提,官方廢棄 synthetic 當然不是鼓勵大家回去用 findViewById 或 ButterKnife 而是很清楚明白的跟大家建議使用 View Binding。所以 KT 今天就來介紹一下,如何使用「元件綁定 View Binding」,坦白說不用付出很高的學習成本,學習曲線超級平緩,只是一個起手勢,學起來之後就可以用的很開心、快樂。
View Binding 使用方式
build.gradle (app)
View Binding 預設是被封印,沒有開啟,需要到 build.gradle (app) 開啟 View Binding ,先看一下自己當下 Android Studio 版本,擇一就好不要通通貼上去。
//Android Studio 3.6 (之前版本不能使用)
android {
...
viewBinding {
enabled =true
}
}
//Android Studio 4.0 或更高版本
android {
...
buildFeatures {
viewBinding true
}
}
activity_main.xml
在空白範本(Empty Activity)的佈局當中,在 TextView 裡面,新增一個 id 屬性,屬性值設定為為 tv1
<TextView
android:id="@+id/tv1"
...
/>
app\build\generated
進行編譯(build 或 rebuild)後,每個 Layout 就會對應生成一個綁定類別。如:MainActivity.kt 的 Layout 為 「activity_main.xml」,就會產生一個「ActivityMainBinding.java」,路徑如下,可以開啟該檔案觀摩一下,生成的檔案結構。
MainActivity.kt
在 Activity 使用方式,如下:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.tv1.text = "HKT線上教室"
}
}
執行結果
KT 的偷呷步
若 APP 應用程式裡,有大量頁面(Activity 或 Fragment),可以將 inflate 那一段,用映射的方式寫到自定義的基礎類別裡面,BaseActivity 或 BaseFragment,之後只要在 XML 佈局定義好 id 值,基本上就可以直接拿來用,不用因為畫面元件多,就要事前宣告和 findViewById 定義一堆,大量減少程式與維護的功。
View Binding 與 findViewById & ButterKnife 差異
- Null 安全
- 類型安全
參考資料
developer - View Binding
https://developer.android.com/topic/libraries/view-bindingButterKnife
https://github.com/JakeWharton/butterknifefindViewById
https://developer.android.com/reference/android/view/View#findViewById(int)