---
# System prepended metadata

title: Android筆記(kotlin)--ViewBinding(視圖綁定)
tags: [android, 插件, kotlin, ViewBinding, 視圖綁定]

---

# Android筆記(kotlin)--ViewBinding(視圖綁定)
View Binding 是一種官方推薦且輕量級的工具，它可以在不引入額外的複雜性的情況下幫助開發者綁定視圖。==ViewBinding內建在Android Studio中，但預設是關閉的，需要手動啟用==。

使用 View Binding，Android 系統會自動生成一個對應於每個 layout 文件的綁定類（Binding class）。這個綁定類包含了 layout 文件中的所有視圖元素的直接引用。在大多數情況下，視圖綁定會取代 findViewById。
==簡白的來說，ViewBinding的作用就是能讓"原本需要一堆findViewById()才能產生關連的元件"，可以直接像"layout中的activity_main.xml裡的文字"和"value中的string.xml"一樣，直接使用名子來引用的工具。==

相對於findViewById來說，ViewBinding有以下優點:
- Null safety 空安全：由於視圖綁定創建了對視圖的直接引用，因此不存在因視圖 ID 
                   無效而導致空指針異常的風險。
- Type safety 類型安全：每個綁定類中的字段的類型與其在 XML 文件中引用的視圖相匹配。

----
## ▼啟用:
想要使用View Binding，需先在build.gradle.kts(Module:app)裡啟用View Bingding功能，有三種啟用方式。
:::spoiler ◇方法一◆ 在build.gradle.ktsdependencies中的dependencies段中加上
**備註:此方法可以指定版本號例如:androidx.viewbinding:viewbinding:1.0.0，也可不指定版本。**
```
dependencies{
    ...
    implementation ("androidx.viewbinding:viewbinding")
}
```
![image](https://hackmd.io/_uploads/r1RqMaDwp.png)

---
:::
:::spoiler ◇方法二◆ 在build.gradle.kts中加上(==注意，這裡的"viewBinding"的"v"是小寫==)
```
android{
    ...
    viewBinding{
        enable = true
    }
}

```
![image](https://hackmd.io/_uploads/H1ShV2vP6.png)
:::
:::spoiler ◇方法三◆build.gradle.kts中加上(和方法二差不多)

```
android {
    ...
    buildFeatures {
        viewBinding true
    }
}
```
:::

---
## ▼基本使用:
對一個物件和想要關聯的ViewBinding佈局文件使用"inflate(layoutInflater)"方法後，就可以直接使用名稱就進行引用了。
![image](https://hackmd.io/_uploads/S1uvgQKwp.png)

---
## ▼將別的視圖附加上去


---
※在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? {
        //A或B選一種
        binding = FragmentBlankBinding.inflate(inflater, container, false)//方法A，通常使用的標準寫法
        binding = FragmentBlankBinding.inflate(layoutInflater)//方法B
        return binding.root //改動了這行
    }
}
  ```
  - :::spoiler `inflate(inflate, container, false)`和`inflate(layoutInflater)`的差異
    - `inflate(inflater, container, false)` : 
      - 明確指定 container 為父佈局，設置 false 表示不要立即將佈局附加到父容器中。
      - 這樣可以讓 Fragment 正常管理佈局的附加
      - container 設定後，佈局可以更好地配合父容器的屬性，並確保 Fragment 的生命週期內正確地管理視圖。
    - `inflate(layoutInflater)` : 
      - 使用 layoutInflater 將 FragmentABinding 綁定到佈局，但沒有指定父容器 container。
      - 因為沒有 container，佈局不會自動附加到父佈局中，這樣可能導致無法正確套用一些 Layout 屬性（例如 match_parent 或 wrap_content 等）。
      - 適用於不需要依賴父容器的情境，或是某些自訂的視圖。
    :::


---
參考資料:
---
- [【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)