web-dev-qa-db-ja.com

Android-データバインディングを使用した条件付きテキスト値

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

}
15
Rajkiran

実際、これは私にとってはうまくいきます

<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です。

10

ここに修正/回避策があります:

  1. 条件値が必要なレイアウトの複製XML定義を定義する
  2. ブロックごとに、条件値の1つを設定します
  3. データバインディングブール値に従って各Xml定義の可視性を設定する

理想的な解決策ではなく、あまりきれいではありませんが、機能的には同等です。適切な解決策が見つかるまで、暫定的に機能します。

これが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"
        />
1
Gene Bo