114 votes

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

Essayez de définir la visibilité de View 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}"/>
 

268voto

David Artmann Points 1150

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}"/>
 

64voto

Lior Points 357

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 java ViewModel:

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

46voto

Kiskae Points 11240

Le problème est qu' visibility est Integer sur le View classe, cela signifie que vous avez deux façons de faire ce travail:

  1. Utiliser l' View.VISIBLE et View.GONE des constantes. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Définir votre propre définition pour visibility qui prend un Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Mise en œuvre Possible:

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

Qui rendra <FrameLayout android:visibility="@{sale}"/> de travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X