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.
Oublier le ternaire pour le moment. Est-ce que 'android: layout_width =" @ {60dp} "' fonctionne? – CommonsWare
@ {} 60dp et @ { '60dp'} ne fonctionnent pas – JPM
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