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

29

我希望根据条件将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);
  }

}

1
我认为那个语法是正确的。你遇到了什么问题? - CommonsWare
@CommonsWare 出现了编译错误 Error: Identifiers must have user defined types from the XML file. viewModel is missing it - Rajkiran
1
请问您能否发布您的XML文件?在<data>中似乎缺少一些内容。 - Ravi
你能否将DataBinding代码部分添加到Activity中?另外,你能确认TravellerInfoViewModel类的包实际上是“com.myproject.viewmodel”,还是在添加代码片段时更改为某个占位符了? - binaryKarmic
这仍然不应该导致那个错误。在运行时,您应该得到一个不改变值的不同错误。 - George Mount
显示剩余6条评论
2个回答

30

实际上,这对我很有效

<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,editModeObservableBoolean


你是什么意思 - “双向绑定”? - Andrii Turkovskyi
请参考此链接: https://developer.android.com/topic/libraries/data-binding/two-way - Himanshu
我想问一下,如果我更改了“vm.editMode”,可见性会如何重新计算。这是可能的吗? - Himanshu
正如你在另一个答案中所看到的那样 - 是的,可以以同样的方式更改可见性(如果这是你想要的)。 - Andrii Turkovskyi
需要在我的Fragment中使用@BindingMethods。但我正在处理ImageViews。 - Felipe
显示剩余2条评论

2
这里有一个解决方案/解决方法:
  1. 定义一个与你想要条件值的布局重复的Xml定义
  2. 对于每个块,设置其中一个条件值
  3. 根据数据绑定的布尔值设置每个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"
        />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接