我想在添加到项目的新模块中使用ViewBinding,该模块将包含项目中的所有CustomViews。
目前,此模块是唯一将实现视图绑定的模块。目前,主要模块(应用程序)正在使用kotlin合成。
最初,我有以下2个自定义视图:
(Pre-ViewBinding- >正常工作。我可以在所附的片段中看到它)
CustomView 1:
import kotlinx.android.synthetic.main.layout_horizontal_filter.view.*
class HorizontalFiltersView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private val adapter: HorizontalFilterAdapter
private val decoration: HorizontalFilterDecorator
init {
LayoutInflater.from(context).inflate(R.layout.layout_horizontal_filter, this, true)
this.adapter = HorizontalFilterAdapter(context)
this.decoration = HorizontalFilterDecorator(context, 16)
recycler.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
recycler.adapter = this.adapter
recycler.addItemDecoration(this.decoration)
recycler.setHasFixedSize(true)
}
fun setFilters(filtersList: MutableList<HorizontalFilter>) {
this.adapter.refresh(filtersList)
}
}
CustomView2:
import kotlinx.android.synthetic.main.item_horizontal_filter.view.*
class HorizontalFilterItem @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
private var onClickAction: () -> Unit = {}
init {
LayoutInflater.from(context).inflate(R.layout.item_horizontal_filter, this, true)
setOnClickListener { onClickAction.invoke() }
}
fun setData(image: Int, title: String, action: () -> Unit = {}) {
filter_title.text = title
loadImage(image)
setClickAction(action)
}
fun setClickAction(action: () -> Unit) {
this.onClickAction = action
}
private fun loadImage(image: Int?) {
image?.let { img ->
filter_image?.let { imView ->
Glide.with(this).load(img).fitCenter().into(imView)
}
}
}
}
然后我添加了viewBinding = true
gradle文件并删除了kotlin-android-extensions
插件。
因此,海关看起来像:
class HorizontalFiltersView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private val adapter: HorizontalFilterAdapter
private val decoration: HorizontalFilterDecorator
private val binding = LayoutHorizontalFilterBinding.inflate(LayoutInflater.from(context))
init {
addView(binding.root)
this.adapter = HorizontalFilterAdapter(context)
this.decoration = HorizontalFilterDecorator(context, 16)
binding.recycler.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
binding.recycler.adapter = this.adapter
binding.recycler.addItemDecoration(this.decoration)
binding.recycler.setHasFixedSize(true)
}
fun setFilters(filtersList: MutableList<HorizontalFilter>) {
this.adapter.refresh(filtersList)
}
}
class HorizontalFilterItem @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
private val binding = ItemHorizontalFilterBinding.inflate(LayoutInflater.from(context))
private var onClickAction: () -> Unit = {}
init {
addView(binding.root)
setOnClickListener { onClickAction.invoke() }
}
fun setData(image: Int, title: String, action: () -> Unit = {}) {
binding.filterTitle.text = title
loadImage(image)
setClickAction(action)
}
fun setClickAction(action: () -> Unit) {
this.onClickAction = action
}
private fun loadImage(image: Int?) {
image?.let { img ->
binding.filterImage.let { imView ->
Glide.with(this).load(img).fitCenter().into(imView)
}
}
}
}
从这里开始,一切正常。但是,当我打开片段时,不会显示自定义视图。
因此,在简历中:
使用Kotlkin时,合成器可以正常工作并显示视图,而使用ViewBinding时,则不能使用。
怎么了
尝试替换此行:
private val binding = LayoutHorizontalFilterBinding.inflate(LayoutInflater.from(context))
有了这个:
private val binding = LayoutHorizontalFilterBinding.inflate(LayoutInflater.from(context), this, true)
自最新版本以来,该功能不再有效。Inflate仅接受两个参数和attachToParent,最后一个不见了。