かなり基本的なことですが、テキストを読んだかどうかに基づいて、メッセージのタイトルを太字にします。私はこれに対する解決策を見つけることができないようです。
これが私の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 **** \データバインディングエラー****
私は次のコードを使用することになりました、それは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"}' />
簡単な方法
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}"/>
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}" />
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}"/>