Görünüm görünürlüğünü ayarlamak için veri bağlamayı kullanın


97

Görünürlüğünü ayarlamak için çalışıyorum Viewözel değişken kullanıyor, ancak hata oluşur: Identifiers must have user defined types from the XML file. visible is missing it. Veri bağlamayı kullanarak görünüm görünürlüğünü ayarlamak mümkün mü? Teşekkürler.

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

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

Yanıtlar:


218

Android Geliştirici Kılavuzu'nda belirtildiği gibi, bunu şu şekilde yapmanız gerekir:

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

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

5
ve değer nasıl "satış" olarak ayarlanır?
RobinHood

Yani "sale" değerini bir String değişkenine nasıl atayacağınızı mı kastediyorsunuz?
David Artmann

kesinlikle! Sorunla karşı karşıyayım. Lütfen paylaşın, karşılaştıracağım ve sonra size haber vereceğim.
RobinHood

39
Lanet olsun! Aptalca ithalatı nasıl kaçırdım . Tamamlandı, teşekkürler.
RobinHood

Hey! kaydırmada neden konum hatası olduğu hakkında bir fikriniz var mı? Adaptör
RobinHood

56

Düzeninizde:

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


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

ViewModel java kodunuzda:

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

3
beni küçük bir baş ağrısından kurtardın
Koen Van Looveren

2
Bunun çalışması için veri modelinizin Gözlemlenebilir olması gerekir.
yshahak

bu dahil etmeden benim için çalıştı @Bindable. Eklediğimde, uzatma önerisi de dahil olmak üzere farklı bağlama hataları alıyordum BaseObservable. İyi işaretçi
Gene Bo

2
Kabul edilen cevap olmalı! Benim için mükemmel çalıştı!
Crisic

İçin herhangi bir öneri LiveData<Boolean>?
Sourav Bagchi

41

Sorun olduğunu visibilitybir olduğunu Integerüzerine Viewbu işi yapmak için iki yol vardır sınıfında, bu araçlar:

  1. View.VISIBLEVe View.GONEsabitlerini kullanın . https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Bunun için özel bir ayarlayıcı tanımlayın visibilitya Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Olası uygulama:

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

Hangi yapacak <FrameLayout android:visibility="@{sale}"/>işi.


4
Sizin için uygun olduğunda, açıklama işlemcisi derleme sırasında bunları otomatik olarak algılar.
Kiskae

Teşekkür ederim, onu BindingUtils.java'ma koydum
nhoxbypass

ama değer satışı nasıl belirlenir?
EslamWael74

1
aynı yaklaşımı <include etiketleri için nasıl uygulayabilirim?
Zafer Celaloğlu

1
@ EslamWael74 Java / Kotlin kodunuzdaki bağlama yoluyla satış değerini ayarlarsınız. Val binding = MyClassBinding.inflate (...) gibi bir şey, ve sonra sadece binding.sale = true çağırabilirsiniz.
Matt Robertson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.