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.