- 简单介绍:
ViewBinding大白话讲就是可以帮助开发者快速找到有id的控件,废话不多说往下走..
- 简单使用:
在需要使用模块下.gradle文件中配置:
android { buildFeatures { viewBinding = true } }
配置完成就可以使用了
例如:
class TextActivity : AppCompatActivity() {
lateinit var binding:ActivityTextBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityTextBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btn.setOnClickListener {}
}
}
ActivityTextBinding类是由对应的activity_text.xml文件去生成的,
如果不想让xml去生成对应的Binding文件可以在xml跟标签加上
tools:viewBindingIgnore="true" 即可
- 封装BaseActivity基类
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
protected lateinit var binding: VB
override fun onCreate(savedInstanceState: Bundle?) {
initial()
super.onCreate(savedInstanceState)
binding = createBinding()
setContentView(binding.root)
initView()
initData()
}
open fun initial(){}
protected abstract fun initView()
protected abstract fun initData()
private fun createBinding(): VB {
val vbClass = getVBClass()
val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java)
return inflateMethod.invoke(null, layoutInflater) as VB
}
@Suppress("UNCHECKED_CAST")
private fun getVBClass(): Class<VB> {
val type = javaClass.genericSuperclass as ParameterizedType
val vbClass = type.actualTypeArguments[0] as Class<VB>
return vbClass
}
}
- 封装BaseFragment基类
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
protected lateinit var binding: VB
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = createBinding(inflater, container)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
initData()
}
abstract fun initData()
protected abstract fun initView()
private fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB {
val vbClass = getVBClass()
val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
return inflateMethod.invoke(null, inflater, container, false) as VB
}
@Suppress("UNCHECKED_CAST")
private fun getVBClass(): Class<VB> {
val type = javaClass.genericSuperclass as ParameterizedType
val vbClass = type.actualTypeArguments[0] as Class<VB>
return vbClass
}
}
- 注意
如果开启了混淆请在proguard-rules.pro文件添加:
-keep class * implements androidx.viewbinding.ViewBinding { *; }
大功告成