android 如何在自定义视图上使用视图绑定

ctrmrzij  于 2023-02-02  发布在  Android
关注(0)|答案(6)|浏览(154)

视图绑定作为Android Jetpack的一部分发布
文件:https://developer.android.com/topic/libraries/view-binding
我的问题是,如何使用视图绑定自定义视图。谷歌文档只展示了活动和片段。
我试过了,但是什么都没有显示。

LayoutInflater inflater = LayoutInflater.from(getContext());

然后,我用了这个,但同样,没有运气。

LayoutInflater inflater = (LayoutInflater)
            getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

我想也许我没有针对正确的布局打气筒为我的看法,但不确定。

2hh7jdfx

2hh7jdfx1#

只需通知根,以及是否要附加到它

init { // inflate binding and add as view
    binding = ResultProfileBinding.inflate(LayoutInflater.from(context), this)
}

init { // inflate binding and add as view
    binding = ResultProfileBinding.inflate(LayoutInflater.from(context), this, true)
}

使用哪个inflate方法将取决于XML中的根布局类型。

5n0oy7gb

5n0oy7gb2#

要使用视图绑定,您需要使用生成的绑定类,而不是LayoutInflater,例如,如果布局名称是result_profile.xml,则您需要使用ResultProfileBinding作为:

class CustomView @kotlin.jvm.JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    private lateinit var binding: ResultProfileBinding

    init { // inflate binding and add as view
        binding = ResultProfileBinding.inflate(LayoutInflater.from(context))
        addView(binding.root)
    }

}

1.自动生成类:result_profile.xml-〉ResultProfileBinding(布局名称,附加Binding
1.给固定装置充气

ResultProfileBinding.inflate(LayoutInflater.from(context))

1.使用addView将视图添加到层次结构中,作为:

addView(binding.root)

注意:如果从ConstraintLayout(父类)扩展,则使用constraint set

hjqgdpho

hjqgdpho3#

您可以立即初始化视图绑定属性

private val binding = CustomViewBinding.inflate(LayoutInflater.from(context), this)
mcvgt66p

mcvgt66p4#

如果您尝试使用视图绑定与根视图,这是为我工作:

class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private lateinit var binding: CustomViewBinding

    override fun onFinishInflate() {
        super.onFinishInflate()
        binding = CustomViewBinding.bind(this)
    }
}
ogsagwnx

ogsagwnx5#

这是我能想到的最简单的Kotlin答案,它是一个自定义视图,只封装了一个TextView,并提供了一个update(s:String)函数来更新文本。

<!-- view_stub.xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView android:id="@+id/myTextView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
</layout>

// StubView.kt
class StubView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
) : FrameLayout(context,attrs,defStyleAttr) {

    val binding = ViewStubBinding.inflate(context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater)
            .also { addView(it.root) }

    fun update(updatedText: String) {
        binding.myTextView.text = updatedText
    }
}

我喜欢这个答案的两点是:

  1. bindingval而不是var,我尽量限制var的数量。
    1.使用also {}作用域函数而不是init {}子句,addViewval binding紧密关联,这使得View的示例化感觉更具声明性。
    有人可能会说addView()实际上是一个副作用,应该放在init {}节中,这样它就可以与binding瓦尔的声明分开。我的观点正好相反--声明一个val,然后将其提供给需要它的代码节,我不觉得这是一个副作用。
iszxjhcz

iszxjhcz6#

您可以使用数据绑定工具

binding = DataBindingUtil.inflate(
        LayoutInflater.from(context),
        R.layout.your_layout_id,
        this,
        true
    )

相关问题