Я хотел бы реализовать пользовательское представление или компонент с привязкой данных.
У меня есть следующий макет для пользовательского компонента 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>
И класс kotlin для компонента InfoMaterialCardView.kt
:
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}
изменяемых данных, которые могут изменяться в любое время и обновляться с помощью вызова сервера.
Спасибо!