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}"/>

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}"/>

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;
}

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.