如何使用Android数据绑定库制作粗体文本

Sai*_*han 12 android android-databinding

非常基本,我想根据是否读取文本,使消息标题变为粗体.我似乎找不到解决方案.

这是我的XML代码:

            <TextView
                android:text="@{message.title}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginBottom="5dp"
                android:layout_marginTop="5dp"
                android:layout_toLeftOf="@+id/timestamp"
                android:textSize="18sp"
                android:textStyle='@{message.isRead() ? "bold" : "normal"}'
                android:textColor='@{message.isRead() ? 0xff313131 : 0xff0662ab}' />
Run Code Online (Sandbox Code Playgroud)

颜色变化很好,只有粗体文字给我一些问题.

错误:任务':app:compileDebugJavaWithJavac'的执行失败.

java.lang.RuntimeException:发现数据绑定错误.****/数据绑定错误****msg:在android.widget.TextView上找不到参数类型为java.lang.String的属性'android:textStyle'的setter.file:D:...... xml loc:39:41 - 39:79****\data binding error****

tom*_*ozb 19

一种简单的方法

public class TextViewBindingAdapter {
    @BindingAdapter("isBold")
    public static void setBold(TextView view, boolean isBold) {
        if (isBold) {
            view.setTypeface(null, Typeface.BOLD);
        } else {
            view.setTypeface(null, Typeface.NORMAL);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

XML:

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:isBold="@{item.bold}"/>
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,已接受的答案已过时。 (4认同)

Håk*_*hia 17

您无需创建适配器即可执行此操作。

将字体导入到您的 XML

<data>
    <import type="android.graphics.Typeface" />
...
</data>
Run Code Online (Sandbox Code Playgroud)

将该属性android:typefaceTypeface.defaultFromStyle结合使用:

android:typeface="@{Typeface.defaultFromStyle(message.isRead() ? Typeface.BOLD : Typeface.NORMAL)}"
Run Code Online (Sandbox Code Playgroud)


Sai*_*han 14

我最终使用以下代码,它实现了DataBinding.

public abstract class BindingAdapter {
    @android.databinding.BindingAdapter("android:typeface")
    public static void setTypeface(TextView v, String style) {
        switch (style) {
            case "bold":
                v.setTypeface(null, Typeface.BOLD);
                break;
            default:
                v.setTypeface(null, Typeface.NORMAL);
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和XML

<TextView
    android:text="@{bericht.titel}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:layout_toLeftOf="@+id/timestamp"
    android:textSize="18sp"
    android:textColor='@{bericht.isGelezen() ? 0xff313131 : 0xff0662ab}'
    android:typeface='@{bericht.isGelezen() ? "normal" : "bold"}' />
Run Code Online (Sandbox Code Playgroud)