2016-06-02 24 views
8

Tôi có một lĩnh vực ObservableBoolean trong lớp hoạt động của tôi, được ràng buộc với "kiểm tra" thuộc tính của ToggleButton tôi như vậy:Làm cách nào để thực hiện liên kết dữ liệu hai chiều với ToggleButton?

android:checked="@{activity.editing}" 

Tôi đã hy vọng điều này sẽ tạo ra một mối quan hệ hai chiều giữa các nút và boolean, nhưng nó chỉ mang những thay đổi từ trường đến nút chứ không phải theo cách khác. Tôi đang làm gì sai, hoặc điều này không nằm trong phạm vi của Android DataBinding?

Trả lời

18

Bạn cần một '=' nói với Android mà bạn muốn sử dụng Two-Way databinding:

android:checked="@={activity.editing}" 

Bạn có thể tìm thêm thông tin về in the wordpress article of George Mount này:

Hai -Way Data Binding

Android không miễn nhiễm với dữ liệu điển hình và rất quan trọng để phản ánh những thay đổi từ đầu vào của người dùng trở lại vào mô hình. Ví dụ: nếu dữ liệu ở trên nằm trong biểu mẫu liên hệ, thì sẽ tốt hơn nếu có văn bản đã chỉnh sửa được đẩy trở lại vào mô hình mà không phải kéo dữ liệu từ EditText. Dưới đây là cách bạn làm điều đó:

<layout ...> 
    <data> 
     <variable type="com.example.myapp.User" name="user"/> 
    </data> 
    <RelativeLayout ...> 
     <EditText android:text="@={user.firstName}" .../> 
    </RelativeLayout> 
</layout> 

Khá tiện lợi, eh? Điểm khác biệt duy nhất ở đây là biểu thức được đánh dấu bằng @={} thay vì @{}. Dự kiến ​​rằng hầu hết các ràng buộc dữ liệu sẽ tiếp tục là một chiều và chúng tôi không muốn có tất cả những người nghe được tạo ra và theo dõi những thay đổi sẽ không bao giờ xảy ra.

3

Không cần phải thực hiện ObservableBoolean, bạn có thể thực hiện thao tác này bằng phương pháp getter-setter thường xuyên của biến boolean. Như thế này trong lớp mô hình của bạn

public class User{ 
    private boolean checked; 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 
} 

thực hiện Hai chiều ràng buộc trên ToggleButton của bạn.

<ToggleButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="@={user.checked}"/> 

và tìm nạp giá trị này bằng cách sử dụng biến liên kết.

binding.getUser().isChecked() 
+1

Bạn đang thiếu chú thích '@ Bindable' trong' isChecked() 'và' notifyPropertyChanged (BR.checked) 'trong setter của bạn. – saiyancoder

+1

@saiyancoder Tôi không nghĩ rằng nó cần thiết –

Các vấn đề liên quan