Android 数据绑定,通过函数调用设置 xml 样式
Android Databinding, set xml style from a function call
应用描述
我在一个显示图书列表的简单 android 应用程序中使用数据绑定。
我使用 RecyclerView
来列出它们。
我准备了一个 Book
object 有标题和颜色。
data class Book(val title: String, val color: BookColor)
其中 BookColor
是一个枚举,包含 10 种不同的颜色。
现在,我为所有 10 种颜色(以便它们与深色模式兼容)创建了 10 种不同的样式(为 BookView
自定义视图量身定制)。
问题
我想不通的是如何使用数据绑定将书籍样式应用于实际 BookView
。
我想使用(来自数据绑定)我可以在助手中定义的函数 class,例如:
fun mapColorToStyle(color: Book)
接受 Book
object,它将 book.color
映射到其匹配的 XML 样式。
然后样式将返回到视图(RecyclerView
项)。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="book"
type="com.x.y.model.Book" />
</data>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<BookView
android:id="@+id/squircle"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:padding="26dp"
style="@{???}"
/>
<TextView ... />
</LinearLayout>
有没有办法在不以编程方式设置样式的情况下实现此目的(我怀疑这是一个不错的解决方案)?
您可以使用绑定适配器而不是应用上述样式。
@BindingAdapter("bindBookViewStyle")
fun TextView.bindViewStyle(bookColor: BookColor) {
val style = mapColorToStyle(bookColor)
TextViewCompat.setTextAppearance(this, style)
}
然后修改你的项目xml
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="book"
type="com.xx.xx.Book" />
</data>
<BookView app:bindBookViewStyle="@{book.color}" />
应用描述
我在一个显示图书列表的简单 android 应用程序中使用数据绑定。
我使用 RecyclerView
来列出它们。
我准备了一个 Book
object 有标题和颜色。
data class Book(val title: String, val color: BookColor)
其中 BookColor
是一个枚举,包含 10 种不同的颜色。
现在,我为所有 10 种颜色(以便它们与深色模式兼容)创建了 10 种不同的样式(为 BookView
自定义视图量身定制)。
问题
我想不通的是如何使用数据绑定将书籍样式应用于实际 BookView
。
我想使用(来自数据绑定)我可以在助手中定义的函数 class,例如:
fun mapColorToStyle(color: Book)
接受 Book
object,它将 book.color
映射到其匹配的 XML 样式。
然后样式将返回到视图(RecyclerView
项)。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="book"
type="com.x.y.model.Book" />
</data>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<BookView
android:id="@+id/squircle"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:padding="26dp"
style="@{???}"
/>
<TextView ... />
</LinearLayout>
有没有办法在不以编程方式设置样式的情况下实现此目的(我怀疑这是一个不错的解决方案)?
您可以使用绑定适配器而不是应用上述样式。
@BindingAdapter("bindBookViewStyle")
fun TextView.bindViewStyle(bookColor: BookColor) {
val style = mapColorToStyle(bookColor)
TextViewCompat.setTextAppearance(this, style)
}
然后修改你的项目xml
<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="book"
type="com.xx.xx.Book" />
</data>
<BookView app:bindBookViewStyle="@{book.color}" />