Sử dụng liên kết dữ liệu để đặt chế độ hiển thị Chế độ xem


97

Cố gắng thiết lập tầm nhìn của Viewsử dụng biến tùy chỉnh, nhưng lỗi xảy ra: Identifiers must have user defined types from the XML file. visible is missing it. Có thể đặt khả năng hiển thị dạng xem bằng cách sử dụng liên kết dữ liệu không? Cảm ơn.

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

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

Câu trả lời:


219

Như đã nêu trong Hướng dẫn dành cho nhà phát triển Android , bạn cần thực hiện như sau:

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

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

5
và làm thế nào để đặt giá trị thành "bán"?
RobinHood

Vậy ý bạn là làm thế nào để gán giá trị "sale" cho một biến Chuỗi?
David Artmann

chính xác! Tôi đang đối mặt với vấn đề. Hãy chia sẻ tôi sẽ so sánh và sau đó cho bạn biết.
RobinHood

39
Chết tiệt! Làm thế nào tôi đã bỏ lỡ nhập ngớ ngẩn . Xong, cảm ơn.
RobinHood

Chào! bất kỳ ý tưởng tại sao vị trí trục trặc trên cuộn? Bộ chuyển đổi
RobinHood

56

Trong bố cục của bạn:

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


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

Trong mã java ViewModel của bạn:

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

3
bạn cứu tôi khỏi bị nhức đầu nhẹ
Koen Van Looveren

2
Mô hình dữ liệu của bạn phải có thể quan sát để hoạt động.
yshahak

điều này đã làm việc cho tôi mà không bao gồm @Bindable. Khi tôi bao gồm rằng tôi đã nhận được các lỗi ràng buộc khác nhau, bao gồm cả đề xuất gia hạn BaseObservable. Con trỏ tốt ở đây
Gene Bo

2
Phải là câu trả lời được chấp nhận! Nó làm việc cho tôi một cách hoàn hảo!
Crisic

Bất kỳ đề nghị cho LiveData<Boolean>?
Sourav Bagchi

41

Vấn đề là visibilitylà một Integertrên Viewlớp, phương tiện này, bạn có hai cách để làm cho công việc này:

  1. Sử dụng các hằng số View.VISIBLEView.GONE. https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. Xác định bộ cài đặt tùy chỉnh cho visibilityđiều đó cần a Boolean. https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

Có thể thực hiện:

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

Cái nào sẽ làm cho <FrameLayout android:visibility="@{sale}"/>hiệu quả.


4
Ở những nơi thuận tiện cho bạn, bộ xử lý chú thích sẽ tự động phát hiện chúng trong quá trình biên dịch.
Kiskae

Cảm ơn bạn, tôi đặt nó trong BindingUtils.java tôi
nhoxbypass

nhưng làm thế nào để thiết lập giá trị bán?
EslamWael74

1
làm cách nào để áp dụng cách tiếp cận tương tự đối với thẻ <include?
Zafer Celaloglu

1
@ EslamWael74 bạn đặt giá trị bán thông qua ràng buộc trong mã Java / Kotlin của mình. Một cái gì đó giống như val binding = MyClassBinding.inflate (...), và sau đó bạn có thể chỉ cần gọi bind.sale = true.
Matt Robertson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.