ViewBinding 未在自定义视图中显示视图

Shu*_*udy 4 android android-custom-view kotlin android-viewbinding

我正在尝试在添加到项目中的新模块中使用 ViewBinding,该模块将包含项目中的所有 CustomView。

目前,该模块是唯一实现视图绑定的模块。主模块(应用程序)使用 kotlin 合成。

最初我有这两个自定义视图:

Pre - ViewBinding --> 这是有效的。我可以在附加的片段中看到它)

自定义视图 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

自定义视图2:

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

viewBinding = true然后我在我的文件中添加了build.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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常。但是当我打开片段时,自定义视图不会显示。

总结来说:

通过 Kotlin 合成,它可以工作并显示视图;使用 ViewBinding 则不起作用。

怎么了?

小智 9

Try replacing this line:

    private val binding = LayoutHorizontalFilterBinding.inflate(LayoutInflater.from(context))
Run Code Online (Sandbox Code Playgroud)

with this:

    private val binding = LayoutHorizontalFilterBinding.inflate(LayoutInflater.from(context), this, true)
Run Code Online (Sandbox Code Playgroud)

  • 自最新版本以来,此功能不再有效。Inflate只接受两个参数和attachToParent,最后一个没有了。 (6认同)