Programing

"&&"논리 연산자를 사용한 안드로이드 데이터 바인딩

lottogame 2020. 8. 14. 08:14
반응형

"&&"논리 연산자를 사용한 안드로이드 데이터 바인딩


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 스튜디오 "이스케이프 처리되지 않은 & 또는 종료되지 않은 문자"의 빨간색 강조 표시 오류.

그래서 어떻게 고쳐야할까요?

편집 : 답을 찾았습니다.이 문자는 이스케이프해야합니다.

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

&&로 렌더링되어야합니다 &amp;&amp;.

공식 데이터 바인딩 가이드 에는 이러한 XML 엔터티가 사용되는 비교 연산자의 예가 있습니다.

android:visibility="@{age &lt; 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 &amp;&amp; 2>0) ? `true` : `false`}"

Android에서 자주 사용되는 HTML 문자 엔티티 :

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

다음 은 HTML 엔티티의 전체 목록입니다.


이 문제를 해결할 수있는 최선의 해결책은 새로운 Bindable 메서드를 도입하는 것이 었습니다.

전에:

item_recyclerview.xml:

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !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

반응형