2015-11-26 9 views
11

Ecco un uso tipico di Android di associazione dati:dati Android legame con le risorse condizionali

android:background="@{isError ? @color/red : @color/white}" 

Diventa sempre più difficile quando lo Stato può assumere valori multipli. Edit: utilizzando l'attributo di stato nella chiamata al metodo era l'unico modo per farlo funzionare:

android:background="@{Check.getStatusColor(check.status)}" 

e definire il metodo statico (non ha @Bindable):

public int getStatusColor(int status) { 
    switch (status.get()) { 
     case STATUS_OK: 
      return ContextCompat.getColor(context, R.color.success); 
     case STATUS_WARNING: 
      return ContextCompat.getColor(context, R.color.warning); 
     case STATUS_ERROR: 
      return ContextCompat.getColor(context, R.color.error); 
     default: 
      return ContextCompat.getColor(context, R.color.idle); 
    } 
} 

Come può Lo raggiungo, senza mettere gli operatori ternari nidificati nell'XML (che non trovo molto elegante, btw), o senza passare l'attributo check.status?

EDIT: Aggiungere XML:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <import type="org.honorato.diagnostics.models.Check"/> 
     <variable 
      name="check" 
      type="Check"/> 
    </data> 
    <LinearLayout 
     android:background="@android:color/white" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="72dp" 
     > 

     <LinearLayout 
      android:padding="16dp" 
      android:layout_width="0dip" 
      android:layout_weight="1" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <TextView 
       android:text="@{check.title}" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textColor="@android:color/primary_text_light" 
       android:textStyle="bold" /> 

     </LinearLayout> 

     <ImageView 
      android:padding="16dp" 
      android:src="@{check.getStatusDrawable(check.status)}" 
      android:background="@{check.getStatusColor(check.status)}" 
      android:layout_width="72dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="center_vertical|center_horizontal" /> 

    </LinearLayout> 
</layout> 
+0

Si prega di aggiungere i dati del file xml. Il metodo getColorForSttus ha l'annotazione @Bindable? – Natali

+0

@Natali domanda aggiornata. Ho fatto un trucco per farlo funzionare, ma lo trovo ancora inelegante. Proverò con l'annotazione Bindable – jlhonora

+0

Prova ad aggiungere il metodo @Bindable annotationto a getStatusColor (int status). Dopo si può usare xml come @ {check.statusColor} – Natali

risposta

3

lo farò in questo modo:

android:background="@{check.getStatusColor()}" 

getStatusColor è un metodo non statico di Check e questo il motivo per cui abbiamo accesso al nostro esempio campo status

public int getStatusColor() { 
    switch (status) { 
     case STATUS_OK: 
      return ContextCompat.getColor(context, R.color.success); 
     case STATUS_WARNING: 
      return ContextCompat.getColor(context, R.color.warning); 
     case STATUS_ERROR: 
      return ContextCompat.getColor(context, R.color.error); 
     default: 
      return ContextCompat.getColor(context, R.color.idle); 
    } 
} 

Questo dovrebbe funzionare.

+0

Un avvertimento: usando questa sintassi non penso che lo sfondo si aggiornerà quando viene chiamato 'notifyPropertyChanged (BR.statusColor)'. Questo aggiornerebbe solo le espressioni usando la sintassi '" @ {check.statusColor} "'. –