2015-07-05 23 views
6

Sto provando il nuovo Android Databinding Library e volevo impostare il colore di sfondo della barra degli strumenti utilizzando un'associazione. Di default il colore dovrebbe essere colorPrimary (dal tema).Associazione dati con gli attributi del tema

Prima usavo DataBinding, toolbar sembrava

<android.support.v7.widget.Toolbar 
     android:id="@+id/mainToolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     /> 

Dopo l'aggiunta di un legante, ho voluto impostare il suo sfondo di colorPrimary se nessun colore è legato - sto usando operatore ternario per questo (come menzionato nella guida) - ma causa un errore, poiché gli attributi del tema hanno anche un "?" operatore prima dei loro nomi. Il compilatore pensa che sto iniziando una nuova operazione ternaria.

Quindi è possibile accedere agli attributi del tema all'interno di un'operazione di associazione? Grazie!

Modifica

so di poter ottenere l'attributo di codice il colorPrimary e associarlo con il codice java. Ma mi stavo chiedendo se c'è una soluzione basata su Xml per questo o no.

+3

Siamo spiacenti, non abbiamo ancora il supporto per gli attributi del tema. Come soluzione alternativa, è possibile definirlo come valore di una risorsa colore e utilizzarlo nel ternario tramite @ color/colorPrimary. – yigit

+0

Oh, ok. Proverò il workaround del valore della risorsa. Grazie –

+1

Ha funzionato? utilizzandolo come '? android: attr/textColorPrimary' – subhash

risposta

0

Trovare un modo utilizzando l'associazione dati? Ecco cosa ho fatto con il test. In primo luogo, creare un metodo di rilegatura adattatore personalizzato:

@BindingAdapter({"app:customPrimaryBackground"}) 
public static void setCustomPrimaryBackground(View v, int resId) { 
    TypedValue typedValue = new TypedValue(); 
    Context context = v.getContext(); 
    if (resId == 0) { 
     context.getTheme().resolveAttribute(R.attr.colorPrimary, typedValue, true); 
     v.setBackgroundResource(typedValue.resourceId); 
    } else { 
     // Check the given resource ID is a color or drawable 
     context.getResources().getValue(resId, typedValue, true); 
     Drawable drawable; 
     if (typedValue.type >= TypedValue.TYPE_FIRST_COLOR_INT && typedValue.type <= TypedValue.TYPE_LAST_COLOR_INT) { 
      // It's a color 
      drawable = new ColorDrawable(typedValue.data); 
     } else { 
      drawable = ContextCompat.getDrawable(context, resId); 
     } 

     v.setBackground(drawable); 
    } 
} 

In secondo luogo, il layout xml vincolante:

<data> 
    <variable name="toolBarBackgroundColor" type="int"/> 
</data> 
... 
<android.support.v7.widget.Toolbar 
     android:id="@+id/mainToolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     app:customPrimaryBackground="@{toolBarBackgroundColor}" 
/> 
0

La risposta è un po 'tardi, ma forse aiuta qualcuno.

Per accedere tema attributi in associazione dati, è possibile utilizzare questo:

(immaginare che clickable è Boolean variabile)

android:background="@{clickable ? android.R.attr.selectableItemBackground : android.R.color.transparent}" 

Nessun adattatori vincolanti aggiuntivi o altre cose necessarie.

Problemi correlati