取代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的區別
- Null:因為綁定是以XML直接綁定,不會造成元件跟id搞混,或者是id無效的問題。
- 簡化:綁定的元件可直接不需要在findViewById。
ViewBinding跟DataBinding的差別
- 兩者皆可綁定XML,但是ViewBinding不需要處理註釋,因此更快速。
- ViewBinding不需要特別標記XML的佈局文件。
- ViewBinding 不支持在XML使用動態介面容例如,在XML使用點擊或文字顯示動態。
- ViewBinding 不支持雙向數據綁定。
結論
一些簡單的頁面可以使用ViewBinding,相反複雜的頁面使用DataBinding,這樣一來整體的代碼跟維護性會更高。