2017-10-12 39 views
0

Je sais que je peux utiliser @ dimen/quelque chose ... mais se demandait pourquoi cela ne fonctionne pas et comment le faire fonctionner. M'aidera à comprendre la boîte noire de l'analyseur de données.largeur Android Databinding avec ternaire en utilisant dp en XML

Dans mon XML pour un élément lineralayout:

android:layout_width="@{DataBoundData.dis.equals(IN_PROGRESS) ? 60dp : 
    (DataBoundData.dis.equals(POSTED) ? 60dp : 0dp)}" 

Il montre une erreur sur le 'p' 60dp. J'ai essayé 60d \ p 60dp et quelques autres et rien ne fonctionne

+0

Oublier le ternaire pour le moment. Est-ce que 'android: layout_width =" @ {60dp} "' fonctionne? – CommonsWare

+0

@ {} 60dp et @ { '60dp'} ne fonctionnent pas – JPM

+0

Par conséquent, le problème n'est pas le ternaire. Mon hypothèse est que le langage d'expression ne gère tout simplement pas les constantes de dimension. – CommonsWare

Répondre

2

Pour répondre à la question de savoir pourquoi android:layout_width="@{60dp}" ne fonctionne pas, c'est parce que la liaison de données ne comprend pas le concept de 'dp'.

Vous avez déjà créé une sorte de BindingAdapter pour l'attribut ou cela ne fonctionnerait pas du tout, car layout_width n'est pas pris en charge par défaut. Peut-être vous avez quelque chose comme ceci:

@BindingAdapter("android:layout_width") 
public static void setLayoutWidth(View view, float width) { 
    LayoutParams layoutParams = view.getLayoutParams(); 
    layoutParams.width = (int)width; 
    view.setLayoutParams(layoutParams); 
} 

Il n'y a pas d'indication sur le BindingAdapter ce que le float width est. Il n'a aucun type, donc il n'y a aucun moyen de transférer cette connaissance aux constantes dans le système de liaison de données. C'est la même raison, vous devez utiliser

android:visibility="@{View.INVISIBLE}" 

au lieu de

android:visibility="@{invisible}" 

Il n'y a pas java invisible constante dans le contexte de la définition de la valeur int sur setVisibility()

Vous pouvez passe en une constante entière comme 60 et il va l'affecter. Malheureusement, ce sont des pixels pour LayoutParams et cela change entre les appareils.

Lorsque vous utilisez @dimen/someDimension, liaison de données convertit la dimension en un flotteur au moment où la valeur est extraite des ressources. C'est facile à comprendre parce que Resources.getDimension() renvoie float. De même, Resources.getColor() renvoie un entier, donc chaque fois que vous passez une ressource de couleur, vous passez un nombre entier autour.

Espérons que ça aide.

+0

Donc, si je devais utiliser un flotteur à la place, il comprendrait? Au fait, bien mis ...votre explication, heureux que vous ayez pris le temps de m'apprendre quelque chose de nouveau! – JPM

+1

Oui, cela fonctionnerait, mais ce serait en termes de pixels et pas de dp. Bon pour le prototypage, peut-être, mais pas génial pour une vraie application. –