# 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`。 &lt; <u>相對於 <code>findViewById</code> 來說,<code>ViewBinding</code> 有以下優點</u> &gt; - 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") } ``` ![image](https://hackmd.io/_uploads/r1RqMaDwp.png =70%x) </div> </details> <details><summary>2. 在 <code>build.gradle.kts</code> 中加上(這裡的 <code>viewBinding</code> 的"v"是小寫)</summary> <div> --- ```kotlin= android{ ... viewBinding{ enable = true } } ``` ![image](https://hackmd.io/_uploads/H1ShV2vP6.png) </div> </details> <details><summary>3. <code>build.gradle.kts</code> 中加上(和方法二差不多)</summary> <div> --- ```kotlin= android { ... buildFeatures { viewBinding true } } ``` </div> </details> --- ## ▼基本使用: 對一個物件和想要關聯的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? { 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)