Gunakan data binding untuk menyetel visibilitas tampilan

97

Mencoba untuk mengatur visibilitas Viewmenggunakan variabel kustom, tapi kesalahan terjadi: Identifiers must have user defined types from the XML file. visible is missing it. Apakah mungkin menyetel visibilitas tampilan menggunakan data binding? Terima kasih.

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

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

Jawaban:

218

Seperti yang dinyatakan dalam Panduan Pengembang Android , Anda perlu melakukannya seperti ini:

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

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>
David Artmann
sumber
5
dan bagaimana cara menetapkan nilai ke "penjualan"?
RobinHood
Jadi maksud Anda bagaimana menetapkan nilai "penjualan" ke variabel String?
David Artmann
persis! Saya menghadapi masalah. Tolong bagikan, saya akan membandingkan dan kemudian memberi tahu Anda.
RobinHood
39
Sial! Betapa saya melewatkan impor Konyol . Sudah terimakasih.
RobinHood
Hei! tahu mengapa kesalahan posisi pada gulir? Adaptor
RobinHood
56

Dalam tata letak Anda:

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


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

Dalam kode java ViewModel Anda:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}
Lior
sumber
3
Anda menyelamatkan saya dari sakit kepala ringan
Koen Van Looveren
2
Model data Anda harus Observable agar berfungsi.
yshahak
ini berhasil untuk saya tanpa menyertakan @Bindable. Ketika saya memasukkan bahwa saya mendapatkan kesalahan pengikatan yang berbeda, termasuk saran untuk memperpanjang BaseObservable. Poin yang bagus di sini
Gene Bo
2
Pasti jawaban yang diterima! Ini bekerja untuk saya dengan sempurna!
Crisic
Ada saran untuk LiveData<Boolean>?
Sourav Bagchi
41

Masalahnya adalah yang visibilityada Integerdi Viewkelas, ini berarti Anda memiliki dua cara untuk membuat ini berfungsi:

  1. Gunakan konstanta View.VISIBLEdan View.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Tentukan penyetel kustom untuk visibilityyang membutuhkan Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Penerapan yang mungkin:

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

Yang mana akan <FrameLayout android:visibility="@{sale}"/>berhasil.

Kiskae
sumber
4
Jika Anda merasa nyaman, pemroses anotasi secara otomatis mendeteksinya selama kompilasi.
Kiskae
Terima kasih, saya taruh di BindingUtils.java saya
nhoxbypass
tapi bagaimana cara mengatur nilai jual?
EslamWael74
1
bagaimana saya bisa menerapkan pendekatan yang sama untuk <include tags?
Zafer Celaloglu
1
@ EslamWael74 Anda menyetel nilai penjualan melalui pengikatan di kode Java / Kotlin Anda. Sesuatu seperti val binding = MyClassBinding.inflate (...), lalu Anda dapat memanggil binding.sale = true.
Matt Robertson