Android-View Binding

Thousand
5 min readDec 10, 2020

--

取代findVIewById以及跟DataBinding的區別

設置提醒

僅適用於 android Studio 3.6 Canary 11 及更高版本中使用。

在 build.gradle 添加

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

Activity使用方式

在XML只需要給元件id,之後在Activity裡宣告即可以,ViewBinding的命名會以Activity+名稱+Binding顯示,inflate()會創建綁定提供給Activity,以下範例。

class ViewBindingActivity : AppCompatActivity() {
private lateinit var binding: ActivityViewBindingBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityViewBindingBinding.inflate(
layoutInflater
)
setContentView(binding.root)
binding.activityHelloWord.text = "Hello Word"
}
}

綁定後的TextView ,會顯示”Hello Word”。

Fragment使用方式

跟Activity類似差別於,在onDestroyView需加上binding = null,片段超過了它們的視圖。在銷毀膨脹視圖後清理綁定,以避免任何內存洩漏以下範例。

class ViewBindingFragment : Fragment() {
private var binding: FragmentViewBindingBinding? = null
private val viewBinding get() = binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

binding = FragmentViewBindingBinding.inflate(inflater, container, false)
val view = viewBinding.root
viewBinding.fragmentHelloWord.text = "Hello Word"
return view

}

override fun onDestroyView() {
super.onDestroyView()
binding = null
}
}

adapters使用方式

只要有XML的地方都可以使用,已下範例。

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
ViewBindingViewHolder(
ItemHeaderBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)

class ViewBindingViewHolder(val ui: ItemBinding) : RecyclerView.ViewHolder(ui.root) {
fun bind(item: TestData) {
ui.name.text = item.name
}
}

findViewById的區別

  1. Null:因為綁定是以XML直接綁定,不會造成元件跟id搞混,或者是id無效的問題。
  2. 簡化:綁定的元件可直接不需要在findViewById。

ViewBinding跟DataBinding的差別

  • 兩者皆可綁定XML,但是ViewBinding不需要處理註釋,因此更快速。
  • ViewBinding不需要特別標記XML的佈局文件。
  • ViewBinding 不支持在XML使用動態介面容例如,在XML使用點擊或文字顯示動態。
  • ViewBinding 不支持雙向數據綁定。

結論

一些簡單的頁面可以使用ViewBinding,相反複雜的頁面使用DataBinding,這樣一來整體的代碼跟維護性會更高。

參考資料

https://developer.android.com/topic/libraries/view-binding

https://vladsonkin.com/3-major-benefits-of-view-binding-android/?utm_source=feedly&utm_medium=rss&utm_campaign=3-major-benefits-of-view-binding-android

--

--