# Android筆記(kotlin)--ViewBinding(視圖綁定)
<code>ViewBinding</code> 是一種官方提供、輕量級的 View 綁定工具,用來讓程式碼更安全、更簡潔。它內建於 <code>Android Gradle Plugin</code> 中,但預設不會啟用,需要自行在 `build.gradle` 中開啟。
啟用後,系統會根據每個 <code>XML layout</code>,自動產生一個對應的 <code>Binding 類別</code>。例如: `activity_main.xml` 會產生 `ActivityMainBinding`。
< <u>相對於 <code>findViewById</code> 來說,<code>ViewBinding</code> 有以下優點</u> >
- Null 安全 (Null Safety):因為綁定類別是根據 XML 直接生成的,你只能存取該佈局中「確實存在」的 ID,避免了因 ID 錯誤導致的 `NullPointerException`。
- 型別安全 (Type Safety):每個元件的型別(如 `TextView` 或 `Button`)在生成時已確定,不需要手動強制轉型。
- 簡潔性:減少大量重複的 `findViewById` 樣板程式碼。
----
## ▼啟用:
想要使用 <code>View Binding</code>,需先在 <code>build.gradle.kts(Module:app)</code> 裡啟用 <code>ViewBingding</code> 功能,有三種啟用方式。
<details><summary>1. 在 <code>build.gradle.ktsdependencies</code> 中的 <code>dependencies</code> 段中加上</summary>
<div>
---
**備註:此方法可以指定版本號例如:androidx.viewbinding:viewbinding:1.0.0,也可不指定版本。**
```kotlin=
dependencies{
...
implementation ("androidx.viewbinding:viewbinding")
}
```

</div>
</details>
<details><summary>2. 在 <code>build.gradle.kts</code> 中加上(這裡的 <code>viewBinding</code> 的"v"是小寫)</summary>
<div>
---
```kotlin=
android{
...
viewBinding{
enable = true
}
}
```

</div>
</details>
<details><summary>3. <code>build.gradle.kts</code> 中加上(和方法二差不多)</summary>
<div>
---
```kotlin=
android {
...
buildFeatures {
viewBinding true
}
}
```
</div>
</details>
---
## ▼基本使用:
對一個物件和想要關聯的ViewBinding佈局文件使用"inflate(layoutInflater)"方法後,就可以直接使用名稱就進行引用了。

---
※在 Fragment 中使用 ViewBinding ※
---
前置閱讀: [Android筆記–Fragment](https://hackmd.io/@9YAtszqXS2OLNZOrLY_-Jg/android_Fragment)
### 基本使用: 只需要改動 Fragment Class 的內容即可
```kotlin=
class BlankFragment_2: Fragment() {
private lateinit var binding: FragmentBlankBinding //增加了這行
companion object{
val instance: BlankFragment_2 by lazy {
BlankFragment_2()
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentBlankBinding.inflate(inflater, container, false)// 通常使用的標準寫法
return binding.root //改動了這行
}
}
```
<details><summary>Q: <code>Fragment</code> 的 <code>inflate()</code> 不可以像 <code>Activity</code> 一樣用 <code>layoutInflater</code> 嗎?</summary>
<div>
嚴格來說可以,但是可能會再使用一些 layout 屬性時出錯
---
- <code>inflate(inflater, container, false)</code> :
- 明確指定 container 為父佈局,設置 false 表示不要立即將佈局附加到父容器中。
- 這樣可以讓 Fragment 正常管理佈局的附加
- container 設定後,佈局可以更好地配合父容器的屬性,並確保 Fragment 的生命週期內正確地管理視圖。
- <code>inflate(layoutInflater)</code> :
- 使用 layoutInflater 將 FragmentABinding 綁定到佈局,但沒有指定父容器 container。
- 因為沒有 container,佈局不會自動附加到父佈局中,這樣可能導致無法正確套用一些 Layout 屬性(例如 match_parent 或 wrap_content 等)。
- 適用於不需要依賴父容器的情境,或是某些自訂的視圖。
</div>
</details>
---
參考資料:
---
- [【Android APP 開發教學】元件綁定 View Binding](https://tw-hkt.blogspot.com/2021/01/android-app-view-binding.html)
- [AndroidDevelopers--视图绑定](https://developer.android.com/topic/libraries/view-binding?hl=zh-cn)
- [是时候拥抱ViewBinding了~](https://blog.csdn.net/u010976213/article/details/104501830)
- [Android ViewBinding 使用详解](https://juejin.cn/post/6995069102041595940)
- [Kotlin Android 第18天,從 0 到 ML - View Binding](https://ithelp.ithome.com.tw/articles/10270251?sc=rss.iron)
- ★[影片-【Android 开发教程】50 ViewBinding](https://youtu.be/0WjKrNZ7fcY?si=LqOOX28bazdnR3Cn)
- [[Google Course] Android Basics in Kotlin(第5篇) — ViewBinding](https://happyphoebe40090.medium.com/google-course-android-basics-in-kotlin-%E7%AC%AC5%E7%AF%87-viewbinding-183388315083)