Use vinculação de dados para definir a visibilidade da vista


102

Tentando definir a visibilidade de Viewusar variável personalizada, mas o erro ocorre: Identifiers must have user defined types from the XML file. visible is missing it. É possível definir a visibilidade da vista usando vinculação de dados? Obrigado.

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

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

Respostas:


232

Conforme declarado no Guia do desenvolvedor Android , você precisa fazer assim:

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

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

6
e como definir o valor para "venda"?
RobinHood 01 de

Então você quer dizer como atribuir o valor "venda" a uma variável String?
David Artmann

exatamente! Estou enfrentando um problema. Por favor, compartilhe, vou comparar e depois avisá-lo.
RobinHood 01 de

40
Droga! Como eu perdi a importação boba . Feito, obrigado.
RobinHood 01 de

Ei! alguma ideia de por que falha de posição na rolagem? Adaptador
RobinHood 01 de

58

Em seu layout:

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


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

Em seu código Java ViewModel:

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

3
você me salvou de uma pequena dor de cabeça
Koen Van Looveren

2
Seu modelo de dados deve ser Observável para que funcione.
yshahak de

isso funcionou para mim sem incluir @Bindable. Quando incluí isso, recebia vários erros de ligação, incluindo sugestões de extensão BaseObservable. Boa indicação aqui
Gene Bo

2
Deve ser a resposta aceita! Funcionou perfeitamente para mim!
Crisic

Alguma sugestão para LiveData<Boolean>?
Sourav Bagchi

41

O problema é que visibilityé um Integerna Viewclasse, isso significa que você tem duas maneiras de fazer isso funcionar:

  1. Use as constantes View.VISIBLEe View.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Defina um setter personalizado para visibilityque leve a Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Implementação possível:

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

O que dará certo <FrameLayout android:visibility="@{sale}"/>.


4
Onde for conveniente para você, o processador de anotações os detecta automaticamente durante a compilação.
Kiskae

Obrigado, coloquei no meu BindingUtils.java
nhoxbypass

mas como definir a venda de valor?
EslamWael74

1
como posso aplicar a mesma abordagem para <incluir tags?
Zafer Celaloglu

1
@ EslamWael74, você define o valor de venda por meio da vinculação em seu código Java / Kotlin. Algo como val binding = MyClassBinding.inflate (...), e então você pode simplesmente chamar binding.sale = true.
Matt Robertson de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.