ViewBinding的优点:
- 仅仅支持绑定
View - 不需要在布局文件中添加
layout标签 - 需要在模块级
build.gradle文件中添加viewBinding = true即可使用 - 效率高于
DataBinding,因为避免了与数据绑定相关的开销和性能问题 - 相比于
kotlin-android-extensions插件避免了空异常
Gradle配置:
// Android Studio 3.6
android {
viewBinding {
enabled = true
}
}
// Android Studio 4.0
android {
buildFeatures {
viewBinding = true
}
}
ViewBinding简单使用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
with(binding){
textView.setText("这是ViewBinding")
}
}
}
BaseActivity的封装和使用:
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
lateinit var binding: VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//利用反射,调用指定ViewBinding中的inflate方法填充视图
val type = javaClass.genericSuperclass
if (type is ParameterizedType) {
val clazz = type.actualTypeArguments[0] as Class<VB>
val method = clazz.getMethod("inflate", LayoutInflater::class.java)
binding = method.invoke(null, layoutInflater) as VB
setContentView(binding.root)
}
initData()
}
abstract fun initData()
}
BaseFragment的封装和使用:
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
lateinit var binding: VB
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
//利用反射,调用指定ViewBinding中的inflate方法填充视图
val type = javaClass.genericSuperclass
val clazz = (type as ParameterizedType).actualTypeArguments[0] as Class<VB>
val method = clazz.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
binding= method.invoke(null, layoutInflater, container, false) as VB
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initData()
}
abstract fun initData()
}
版权声明:本文为tanlove1314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。