TextViewのテキストを条件付きでどちらかに設定したいのですが。
Androidデータバインディングのドキュメントでは、テキストがビューモデルのプロパティである場合は、条件付きでテキストを設定できることが推奨されています。例えば.
Android:text="@{user.displayName != null ? user.displayName : user.lastName}"
しかし、ビューモデルに追加するのではなく、strings.xmlからテキストを設定する方法はありますか?このようなものが欲しい
Android:text="@{viewModel.expanded ? @string/collapse : @string/expand}"
XMLは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:bind="http://schemas.Android.com/apk/res-auto">
<data class="TravellerInfoBinding">
<import type="Android.view.View" />
<variable name="viewModel" type="com.myproject.viewmodel.TravellerInfoViewModel" />
</data>
<LinearLayout Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:orientation="horizontal">
<ImageView Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_vertical"
Android:src="@drawable/expandable_arrow_blue" />
<TextView style="@style/primary_pair_element_value"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@{viewModel.expanded ? @string/taxes_fees_detail : @string/hide_taxes_fees_detail}"
Android:textSize="12sp" />
</LinearLayout>
</layout>
そして、これは私のビューモデルです。
package com.myproject.viewmodel;
imports...
public class TravellerInfoViewModel extends BaseObservable {
@Bindable
private final TaxDetailsViewModel taxDetailsViewModel;
@Bindable
private boolean expanded;
Constructor....
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
notifyPropertyChanged(BR.expanded);
}
public void toggleExpanded() {
setExpanded(!expanded);
}
}
実際、これは私にとってはうまくいきます
<TextView
Android:id="@+id/btnEdit"
style="@style/Common.Toolbar.Action.Text"
Android:onClickListener="@{onEditClick}"
Android:text="@{vm.editMode ? @string/contacts_done : @string/contacts_edit}"
tools:text="@string/contacts_edit"/>
ここで、vm
-これはViewModelであり、editMode
-ObservableBoolean
です。
ここに修正/回避策があります:
理想的な解決策ではなく、あまりきれいではありませんが、機能的には同等です。適切な解決策が見つかるまで、暫定的に機能します。
これがAndroid:textStyle
で解決した方法です。ここでは、値をboldで表示するための特別なケース要件がありました。
<variable
name="viewModel"
type="com.demo.app.SomeViewModel"/>
...
<TextView
style="@style/RowValue"
Android:visibility="@{ ! viewModel.boldRow ? View.VISIBLE : View.GONE}"
Android:text="@{viewModel.currentValue}"
/>
<TextView
style="@style/RowValue"
Android:visibility="@{ viewModel.boldRow ? View.VISIBLE : View.GONE}"
Android:text="@{viewModel.currentValue}"
Android:textStyle="bold"
/>