cơ sở dữ liệu android sử dụng toán tử logic & &


131

Tôi đang cố gắng sử dụng toán tử và "&&" trong xml bằng cách sử dụng cơ sở dữ liệu Android,

android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"

nhưng tôi đã nhận được lỗi biên dịch:

Lỗi: Thực thi không thành công cho nhiệm vụ ': app: dataBindingProcessLayoutsDevDebug'. org.xml.sax.SAXPudeException; systemId: file: /Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; số dòng: 106; số cột: 89; Tên thực thể phải ngay lập tức theo '&' trong tham chiếu thực thể.

và lỗi tô sáng màu đỏ trong studio android "ký tự không bị hủy bỏ hoặc không kết thúc".

Vậy tôi nên sửa cái này như thế nào?

Chỉnh sửa: tìm thấy câu trả lời, những ký tự này cần phải được thoát:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

Tôi đã nhận thấy rằng tôi có thể sử dụng ">" và "<" trong bố cục tệp xml.
Hồng

Câu trả lời:


233

&&nên được kết xuất như &amp;&amp;.

Hướng dẫn liên kết dữ liệu chính thức có các ví dụ về các toán tử so sánh nơi các thực thể XML này được sử dụng, ví dụ

android:visibility="@{age &lt; 13 ? View.GONE : View.VISIBLE}"

Biên tập

Các biểu thức ví dụ tôi đã đề cập trong câu trả lời đã biến mất khỏi phiên bản tiếng Anh của các tài liệu kể từ khi câu trả lời này được viết. Họ tồn tại trong một số phiên bản không phải tiếng Anh của các tài liệu như phiên bản tiếng Tây Ban Nha.

Dù bằng cách nào, câu trả lời ban đầu vẫn hợp lệ, bởi vì việc sử dụng các thực thể XML trong XML là tiêu chuẩn trong XML và không liên quan gì đến chính Android.


12
Không sử dụng logic miền trong các biểu thức ràng buộc, bạn có các chỉ định / bộ điều khiển cho việc này.
artkoenig

2
@ ArtjomKönig nếu bạn phải ẩn / hiển thị một số điều khiển trong UI thì sao? Tôi sử dụng thư viện liên kết dữ liệu để KHÔNG viết mã UI
Krusty

3
@Krusty Cải tiến một phương thức isMyControlVisible () trong người thuyết trình của bạn, nơi bạn sử dụng logic miền của mình để trả về đúng hoặc sai. Liên kết với phương pháp này.
artkoenig

1
Tôi nghĩ rằng nếu bạn có quá nhiều biến boolean thì giải pháp này là ổn. Nếu không, mã của bạn sẽ có nhiều ObservableBoolean.set
Lester

@artkoenig sau đó bạn sẽ phải duy trì các booleans thêm đó ở mọi nơi bạn tham chiếu đến bố cục. Nguồn lỗi.
Ali Kazi

36

Danh sách các thực thể HTML

Bạn không thể sử dụng & hoặc một số thực thể HTML khác trong XML. Vì vậy, bạn phải sử dụng nhân vật thoát.

android:text="@{(1==1 &amp;&amp; 2>0) ? `true` : `false`}"

Các thực thể ký tự HTML thường được sử dụng trong Android:

+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity     |  |  |  |
+--------+----------------------------+--+--+--+
| >      | &gt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| <      | &lt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| "      | &quot;, &ldquo; or &rdquo; |  |  |  |
+--------+----------------------------+--+--+--+
| '      | &apos;, &lsquo; or &rsquo; |  |  |  |
+--------+----------------------------+--+--+--+
| }      | &#125;                     |  |  |  |
+--------+----------------------------+--+--+--+
| &      | &amp;                      |  |  |  |
+--------+----------------------------+--+--+--+
| space  | &#160;                     |  |  |  |
+--------+----------------------------+--+--+--+

Dưới đây là danh sách đầy đủ các thực thể HTML.


17

Thoát && trong đánh dấu bố cục là một giải pháp rất kém. Tốt hơn là tạo một phương thức trên đối tượng mô hình (view):

android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"

public boolean isAdult() {
    return age >= 18;
}

4
Mặc dù đây là một giải pháp tốt, nhưng thật không may, nó không được gọi khi giá trị biến thay đổi (notifyPropertyChanged) và khả năng hiển thị sẽ không được cập nhật.
Bernd Kampl

2
@BerndKampl Sử dụngObservableBoolean isAdult
S1ngoooor

Điều này sẽ không làm việc, nó sẽ chỉ được gọi một lần!
Mã hóa

@BerndKampl làm thế nào để sử dụng nó, nó vẫn được gọi một lần
Mã hóa

@CodingTT nhìn vào Câu trả lời của tôi, bạn sẽ cần một cuộc gọi notifyPropertyChanged ở đâu đó để cập nhật nó.
Bernd Kampl

3

Giải pháp tốt nhất mà tôi có thể đưa ra cho vấn đề này là giới thiệu một phương pháp Bindable mới.

Trước:

item_recyclerview.xml:

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}"
/>

MyDataModelClass: (đang được tổ chức trong viewmodel của tôi)

...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
    return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
    this.lastAddeditem = lastAddedItem;
    notifyPropertyChanged(BR.lastAddedItem);
}
@Bindable
public boolean isEditTextDisabled() {
    return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
    this.editTextDisabled = editTextDisabled;
    notifyPropertyChanged(BR.editTextDisabled);
}

Sau:

item_recyclerview.xml:

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>

MyDataModelClass: (đang được tổ chức trong viewmodel của tôi)

...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
    return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
    this.lastAddeditem = lastAddedItem;
    notifyPropertyChanged(BR.lastAddedItem);
    notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEditTextDisabled() {
    return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
    this.editTextDisabled = editTextDisabled;
    notifyPropertyChanged(BR.editTextDisabled);
    notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEnableEditing() {
    return isLastAddedItem() && !isEditTextDisabled();
}

Mã đó đang sử dụng các lớp BaseObservable, BR là lớp liên kết được tạo. Xem bài đăng này để được giải thích chi tiết hơn: Medium.com/@jencisov/ Hãy
Bernd Kampl
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.