ViewBinding的使用
Android获取控件有很多种方法,最基础的findViewById,实用但是麻烦。使用kotlin后应该会接触到插件kotlin-android-extensions,用起来很好用,子需要输入控件id,根据代码自动补全选择相应布局文件引用就可以直接获取到控件,不过因为种种原因这个方法被google废弃掉了,感兴趣的同学可以自行百度。那么就进入今天的主角了ViewBinding,以前我就有看到过不过没有仔细了解,今天闲下来仔细学习了一下,ViewBinding优点很多,下面我们具体介绍使用方法。
引入ViewBinding
ViewBinding使用方法很简单,使用它有两个条件
1.Android studio 3.6.0版本以上
2.gradle3.6.0版本以上
首先在build.gradle配置:
android {
...
Features {
viewBinding true
}
}
使用ViewBinding后自己的布局文件都会自动生成一个binding,例如xml:activity_layout_main.xml,生成后的binding叫ActivityLayoutMainBinding,以下划线断点成大驼峰形式。可以直接在文件中使用它,使用方法如下
在activity中使用:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLayoutMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//通过binding.控件id可以直接获得控件
binding.textView.text = "哈哈哈哈哈"
binding.progress.max = 300
}
下面我们来给binding封装一下,封装到基类BaseActivity中:
abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
lateinit var binding: T
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = inflateBinding()
setContentView(binding.root)
initView()
initData()
}
protected abstract fun inflateBinding(): T
protected abstract fun initView();
protected abstract fun initData();
}
在使用的时候:
class MainActivity2 : BaseActivity<ActivityKotlinTestBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.bv.max = 300f
binding.bv.bottomText = "模考分数"
binding.bv.setAnimaion(270f)
binding.tvConfirm.setOnClickListener {
}
}
//XML布局文件名为activity_kotlin_test.xml,自动生成的binding为ActivityKotlinTestBinding
override fun inflateBinding(): ActivityKotlinTestBinding {
return ActivityKotlinTestBinding.inflate(layoutInflater)
}
override fun initView() {
}
override fun initData() {
}
}
在fragment中使用(下面介绍封装后的方法):
abstract class BaseFragment<T : ViewBinding> : Fragment() {
var binding: T? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = inflateBinding()
return binding?.root
}
//由于 Fragment 的存在时间比其视图长,需要在 onDestroyView() 方法中清除对绑定类实例的所有引用
override fun onDestroyView() {
super.onDestroyView()
binding = null
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initView()
initData()
}
protected abstract fun inflateBinding():T
protected abstract fun initView()
protected abstract fun initData()
class TestFragment : BaseFragment<FragmentTestBinding>() {
override fun inflateBinding(): FragmentTestBinding {
return FragmentTestBinding.inflate(layoutInflater)
}
override fun initView() {
binding.textView.setOnClickListener{
}
}
override fun initData() {
binding.textView.text = "hhhhhhhh"
}
}