web-dev-qa-db-fra.com

Utiliser la liaison de données pour définir la visibilité de la vue

Essayez de définir la visibilité de View à l'aide d'une variable personnalisée, mais une erreur se produit: Identifiers must have user defined types from the XML file. visible is missing it. Est-il possible de définir la visibilité de la vue à l'aide de la liaison de données? Merci.

<data>
    <variable
        name="sale"
        type="Java.lang.Boolean"/>
</data>

<FrameLayout Android:visibility="@{sale ? visible : gone}"/>
51

Comme indiqué dans le Guide du développeur Android , vous devez procéder comme suit:

<data>
    <import type="Android.view.View"/>
    <variable
        name="sale"
        type="Java.lang.Boolean"/>
</data>

<FrameLayout Android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
113
David Artmann

Dans votre mise en page:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 Android:layout_width="10dp"
 Android:layout_height="10dp"
 Android:visibility="@{viewModel.saleVisibility, default=gone}"/>

Dans votre code ViewModel Java:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}
34
Lior

Le problème est que visibility est un Integer sur la classe View, cela signifie que vous disposez de deux méthodes pour que cela fonctionne:

  1. Utilisez les constantes View.VISIBLE et View.GONE. https://developer.Android.com/topic/libraries/data-binding/index.html#imports
  2. Définissez un configurateur personnalisé pour visibility prenant un Boolean. https://developer.Android.com/topic/libraries/data-binding/index.html#custom_setters

Mise en oeuvre possible:

@BindingAdapter("Android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

Ce qui fera fonctionner <FrameLayout Android:visibility="@{sale}"/>.

22
Kiskae