2016-06-09 15 views
5

Chcę ustawić tekst mojego warunku tekstowego warunkowo na jeden lub drugi.Android - Wartość warunkowa tekstu przy użyciu powiązania danych

Dokumentacja powiązania danych Androida sugeruje, że można ustawić tekst warunkowo, jeśli tekst jest właściwością modelu widoku. na przykład

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

Ale czy istnieje sposób, aby ustawić tekst z pliku strings.xml zamiast dodawać go w moim modelu widoku? Chcę coś jak to-

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

XML wygląda nieco jak poniżej:

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

I to jest moim zdaniem Model-

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

} 
+0

Myślałem, że składnia działała. Jakie problemy napotykasz? – CommonsWare

+0

To prawda, czy masz jakiś błąd? –

+0

@CommonsWare Uzyskiwanie tego błędu kompilacji 'Błąd: Identyfikatory muszą mieć typy zdefiniowane przez użytkownika z pliku XML. viewModel brakuje go ' – Rajkiran

Odpowiedz

0

Oto poprawka/obejście:

  1. zdefiniuj duplikat definicji pliku XML, w której chcą wartość warunkową
  2. dla każdego bloku, ustawić jeden stanu wartości
  3. ustawić widoczność każdej definicji Xml Według danych wiążących wartość logiczną

Not idealne rozwiązanie, niezbyt ładna .. ale funkcjonalnie równoważny - i działa w międzyczasie, dopóki nie znajdzie odpowiedniego rozwiązania.

Oto jak rozwiązałem go pod kątem android:textStyle, gdzie miałem specjalny wymóg dotyczący pokazywania wartości w pogrubioną.

<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" 
     /> 
Powiązane problemy