2016-06-09 14 views
5

Desidero impostare il testo della mia TextView su uno o l'altro in modo condizionale.Android - Valore di testo condizionale utilizzando Associazione dati

La documentazione di Android Data Binding suggerisce che è possibile impostare il testo in modo condizionale se il testo è una proprietà del modello di vista. per esempio.

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

Ma c'è un modo per impostare il testo da strings.xml piuttosto che aggiungerlo nel mio modello di vista? Voglio qualcosa come questo-

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

L'XML sembra un po 'come questo:

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

E questa è la mia opinione Modello-

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

Ho pensato che la sintassi funzionasse. Quali problemi stai incontrando? – CommonsWare

+0

È corretto, hai qualche errore? –

+0

@CommonsWare Ottenere questo errore di compilazione 'Errore: gli identificatori devono avere tipi definiti dall'utente dal file XML. viewModel manca ' – Rajkiran

risposta

0

Ecco una correzione/work-around:

  1. definire una definizione Xml duplicata del layout in cui si vogliono un valore condizionale
  2. per ogni blocco, impostare una delle condizioni valori
  3. impostare la visibilità di ogni definizione XML in base al legame dei dati valore booleano

Non è la soluzione ideale, non molto carina .. ma funzionalmente equivalente - e funziona nel frattempo fino a trovare una soluzione adeguata.

Ecco come l'ho risolto per android:textStyle, dove avevo un requisito speciale per la visualizzazione di valori in in grassetto.

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