web-dev-qa-db-fra.com

Android - Valeur de texte conditionnelle utilisant la liaison de données

Je veux définir le texte de mon TextView conditionnellement à l'un ou l'autre.

La documentation Android Data Binding suggère que vous puissiez définir le texte de manière conditionnelle s'il est une propriété du modèle de vue. par exemple.

Android:text="@{user.displayName != null ? user.displayName : user.lastName}"

Mais existe-t-il un moyen de définir le texte à partir du fichier strings.xml plutôt que de l'ajouter à mon modèle de vue? Je veux quelque chose comme ça-

Android:text="@{viewModel.expanded ? @string/collapse : @string/expand}"

Le XML ressemble un peu à ceci:

<?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>

Et c'est mon point de vue modèle-

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

}
10
Rajkiran

En fait, cela fonctionne bien pour moi

<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 - c'est un ViewModel et editMode - c'est ObservableBoolean

2
Andrey Turkovsky

Voici un correctif/solution de contournement:

  1. définir une définition XML en double de la mise en page pour laquelle vous souhaitez une valeur conditionnelle
  2. pour chaque bloc, définissez l'une des valeurs de condition
  3. définir la visibilité de chaque définition XML en fonction de la valeur booléenne de liaison de données

Pas la solution idéale, pas très jolie .. mais fonctionnellement équivalente - et fonctionne dans l’intervalle jusqu’à ce que la solution appropriée soit trouvée. 

Voici comment je l'ai résolu pour Android:textStyle, où j'avais une exigence de cas particulier pour afficher les valeurs dans gras .

    <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"
        />
0
Gene Bo