web-dev-qa-db-ja.com

Androidデータバインディングライブラリを使用して太字のテキストを作成する方法

かなり基本的なことですが、テキストを読んだかどうかに基づいて、メッセージのタイトルを太字にします。私はこれに対する解決策を見つけることができないようです。

これが私の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}' />

色の変更はうまく機能しています。太字のテキストだけが問題を引き起こしています。

エラー:タスク ':app:compileDebugJavaWithJavac'の実行に失敗しました。

Java.lang.RuntimeException:データバインディングエラーが見つかりました。 **** /データバインディングエラー**** msg:Android.widget.TextViewでパラメータタイプJava.lang.Stringの属性 'Android:textStyle'のセッターが見つかりません。 file:D:...... xml loc:39:41-39:79 **** \データバインディングエラー****

14
Saif Bechan

私は次のコードを使用することになりました、それは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;
        }
    }
}

そして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"}' />
15
Saif Bechan

簡単な方法

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);
        }
    }
}

XML:

    <TextView
        Android:id="@+id/text"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:isBold="@{item.bold}"/>
21
tomrozb

Saif Bechanの答えは正解ですが、ビューモデルからのデータバインディングを容易にするために少し変更を加えました。

public abstract class BindingAdapter {
    @Android.databinding.BindingAdapter("app:textStyle")
    public static void setTextStyle(TextView v, int style) {
        v.setTypeface(null, style);
    }
}

次に、app名前空間をXMLに取り込みます

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
...
</layout>

ビューモデルでバインディングを作成する

@Bindable
public int getValueFormat() {
    String message = getMyObject().getValue();
    if (message == MyObject.DEFAULT_VALUE)
        return Typeface.ITALIC;

    return Typeface.NORMAL;
}

これを直接バインドできるようになりました

<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    app:textStyle="@{viewModel.valueFormat}"
    Android:text="@{viewModel.value}" />
3
Kirk

typefaceをxmlファイルにインポートして、次のようにチェックする必要があります。

    <variable
        name="vm"
        type="com.example.VM" />

    <import type="Android.graphics.Typeface" />


        <TextView
            Android:id="@+id/username"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textStyle="@{vm.isBold ? Typeface.BOLD : Typeface.NORMAL}"/>
0
Andrew Emad