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.