自定义组件中的双向数据绑定

时间:2018-09-14 07:06:51

标签: android data-binding kotlin android-custom-view

我想通过数据绑定实现自定义视图或组件。

自定义组件info_card_view.xml具有以下布局:

<android.support.design.card.MaterialCardView
    style="@style/Widget.MaterialComponents.CardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="100dp">

    <TextView
        android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.design.card.MaterialCardView>

以及组件InfoMaterialCardView.kt的kotlin类:

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

    var binding: InfoCardViewBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.info_card_view, this, true)

    lateinit var header: String

    init {
        context.theme.obtainStyledAttributes(
                attrs,
                R.styleable.InfoMaterialCardView,
                0, 0).apply {
            try {
                header = getString(R.styleable.InfoMaterialCardView_header) ?: ""
                binding.header.text = header
            } finally {
                recycle()
            }
        }
    }
}

在此处创建自定义属性的文件:

<resources>
    <declare-styleable name="InfoMaterialCardView">
        <attr name="header" format="string" />
    </declare-styleable>
</resources>

使用以下代码,我可以按如下方式使用该组件:

<com.pitagorinesgroup.streamrights.utils.views.InfoMaterialCardView
                android:id="@+id/infoMaterialCardView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                custom:header="initial"/>

那很好,并且标题的值设置为initial,但我想实现类似的目的:

<com.pitagorinesgroup.streamrights.utils.views.InfoMaterialCardView
                android:id="@+id/infoMaterialCardView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                custom:header="@={value}"/>

使用@={value}可变的实时数据,可以随时更改并通过服务器调用进行更新。

谢谢!

0 个答案:

没有答案