"&&"논리 연산자를 사용한 안드로이드 데이터 바인딩
Android 데이터 바인딩을 사용하여 xml에서 및 "&&"연산자를 사용하려고합니다.
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
하지만 컴파일 오류가 발생했습니다.
오류 : ': app : dataBindingProcessLayoutsDevDebug'작업에 대한 실행이 실패했습니다. org.xml.sax.SAXParseException; systemId : 파일 : /Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; lineNumber : 106; columnNumber : 89; 엔티티 이름은 엔티티 참조에서 '&'바로 뒤에 와야합니다.
Android 스튜디오 "이스케이프 처리되지 않은 & 또는 종료되지 않은 문자"의 빨간색 강조 표시 오류.
그래서 어떻게 고쳐야할까요?
편집 : 답을 찾았습니다.이 문자는 이스케이프해야합니다.
'&' --> '&'
'<' --> '<'
'>' --> '>'
&&
로 렌더링되어야합니다 &&
.
공식 데이터 바인딩 가이드 에는 이러한 XML 엔터티가 사용되는 비교 연산자의 예가 있습니다.
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
편집하다
답변에서 언급 한 예제 표현은이 답변이 작성된 이후로 영어 버전의 문서에서 사라졌습니다. 그들은 스페인어 버전과 같은 오래된 비 영어 버전의 문서에서 살아남습니다.
어느 쪽이든 XML의 XML 엔티티 사용은 XML의 표준이며 Android 자체와 관련이 없기 때문에 원래 답변은 여전히 유효합니다.
레이아웃 마크 업에서 &&를 이스케이프하는 것은 매우 좋지 않은 솔루션입니다. (view) model 개체에 메서드를 만드는 것이 좋습니다.
android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"
public boolean isAdult() {
return age >= 18;
}
HTML 엔티티 목록
XML에서 & 또는 다른 HTML 엔티티 를 사용할 수 없습니다 . 따라서 이스케이프 문자를 사용해야합니다.
android:text="@{(1==1 && 2>0) ? `true` : `false`}"
Android에서 자주 사용되는 HTML 문자 엔티티 :
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
다음 은 HTML 엔티티의 전체 목록입니다.
이 문제를 해결할 수있는 최선의 해결책은 새로운 Bindable 메서드를 도입하는 것이 었습니다.
전에:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !myViewModel.myDataModelClass.editTextDisabled}"
/>
MyDataModelClass
: (내 viewmodel에서 개최 중)
...
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);
}
후:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
MyDataModelClass
: (내 viewmodel에서 개최 중)
...
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();
}
참고 URL : https://stackoverflow.com/questions/37152824/android-databinding-using-logical-operator
'Programing' 카테고리의 다른 글
동일한 이름의 구성이 이미 있습니다. (0) | 2020.08.14 |
---|---|
boxed Long 값 127과 128 비교 (0) | 2020.08.14 |
XML에서 문자열로 org.w3c.dom.Document를로드하려면 어떻게해야합니까? (0) | 2020.08.14 |
Active Directory에서 사용자 그룹을 가져 오는 방법은 무엇입니까? (0) | 2020.08.14 |
CSS 상자 그림자-상단 및 하단 만 (0) | 2020.08.14 |