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}"/>
Konstantin Konopko
fonte

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}"/>
David Artmann
fonte
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;
}
Lior
fonte
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}"/>.

Kiskae
fonte
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