Android - 使用数据绑定的条件文本值

时间:2016-06-09 12:23:37

标签: android data-binding android-databinding

我想将TextView的文本有条件地设置为其中一个。

Android数据绑定文档建议您可以在文本是视图模型的属性时有条件地设置文本。 e.g。

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

}

2 个答案:

答案 0 :(得分:3)

实际上,这对我来说很好

<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

答案 1 :(得分:0)

这是一个修复/解决方法:

  1. 定义您想要条件值的布局的重复Xml定义
  2. 对于每个块,设置其中一个条件值
  3. 根据数据绑定布尔值
  4. 设置每个Xml定义的可见性

    不是理想的解决方案,不是非常漂亮..但在功能上相当 - 并且在临时工作直到找到正确的解决方案。

    以下是我为android:textStyle解决的问题,其中我有一个特殊情况需要以粗体显示值。

        <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"
            />