"&&" mantıksal işleci kullanarak android veri bağlama


132

Android veritabanını kullanarak xml'de and "&&" operatörünü kullanmaya çalışıyorum,

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

ama derleme hatası aldım:

Hata: ': app: dataBindingProcessLayoutsDevDebug' görevi için yürütme başarısız oldu. eşleşmelidir.org.XML.sax.SAXParseException; systemId: dosya: /Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; lineNumber: 106; columnNumber: 89; Varlık adı, varlık referansındaki "&" işaretinin hemen ardından gelmelidir.

ve android stüdyo "çıkış karaktersiz ve sonlandırılmamış karakter" de kırmızı vurgu hatası.

Peki bunu nasıl düzeltmeliyim?

Düzenleme: cevabı buldum, bu karakterlerin kaçması gerekiyor:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

Düzen xml dosyalarında ">" ve "<" kullanabileceğimi fark ettim.
Hong

Yanıtlar:


234

&&olarak işlenmelidir &amp;&amp;.

Resmi veri bağlama kılavuzunda , bu XML varlıklarının kullanıldığı karşılaştırma işleci örnekleri vardır, örneğin

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

Düzenle

Cevapta bahsettiğim örnek ifadeler, bu cevap yazıldığı için dokümanların İngilizce versiyonundan kayboldu. İspanyolca sürüm gibi belgelerin bazı eski İngilizce olmayan sürümlerinde hayatta kalırlar.

Her iki durumda da orijinal yanıt hala geçerlidir, çünkü XML'de XML varlıklarının kullanımı XML'de standarttır ve Android'in kendisiyle hiçbir ilgisi yoktur.


12
Bağlama ifadelerinde etki alanı mantığı kullanmayın, bunun için ön ayarlayıcılarınız / denetleyicileriniz var.
artkoenig

2
@ ArtjomKönig, kullanıcı arayüzündeki bazı kontrolleri gizlemek / göstermek zorunda kalırsanız ne olacak? UI kodu
Krusty

3
@Krusty Imlement, doğru veya yanlış geri döndürmek için etki alanı mantığınızı kullandığınız sunumcunuzda, isMyControlVisible () yöntemidir. Bu yönteme bağlanın.
artkoenig

1
Bence çok fazla boole değişkeniniz varsa, bu çözümler iyidir. Aksi takdirde kodunuzda bol miktarda ObservableBoolean.set bulunur
Lester

@artkoenig o zaman bu ekstra boole'ları, düzene başvurduğunuz her yerde korumanız gerekir. Böceklerin kaynağı.
Ali Kazi 18-19

36

HTML varlıklarının listesi

XML'de & veya başka bir HTML varlığını kullanamazsınız . Yani kaçan karakter kullanmanız gerekiyor.

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

Android'de sıklıkla kullanılan HTML Karakter varlıkları:

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

İşte HTML varlıklarının tam listesi.


17

Yerleşim biçimlendirmesinde && kaçmak çok kötü bir çözümdür. (Görünüm) modeli nesnesinde bir yöntem oluşturmak daha iyidir:

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

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

4
Bu iyi bir çözüm olsa da, değişken değeri değiştiğinde (notifyPropertyChanged) maalesef çağrılmıyor ve görünürlük güncellenmiyor.
Bernd Kampl

2
@BerndKampl UseObservableBoolean isAdult
S1ngoooor

Bu işe yaramayacak, sadece bir kez çağrılacak!
CodingTT

@BerndKampl nasıl kullanılır, yine de bir kez çağrılır
CodingTT

@CodingTT Cevabıma bak, güncellemek için bir yerde bir notifyPropertyChanged çağrısına ihtiyacın olacak.
Bernd Kampl

3

Bu sorun için bulabileceğim en iyi çözüm, yeni bir Bindable yöntemi sunmaktı.

Önce:

item_recyclerview.xml:

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

MyDataModelClass: (benim görüş modelimde tutuluyor)

...
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);
}

Sonra:

item_recyclerview.xml:

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

MyDataModelClass: (benim görüş modelimde tutuluyor)

...
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();
}

Bu kod BaseObservable sınıflarını kullanıyor, BR üretilen bağlama sınıfıdır. Daha ayrıntılı bir açıklama için bu gönderiye
Bernd Kampl,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.