एंड्रॉइड डेटाबाइंडिंग "&&" तार्किक ऑपरेटर का उपयोग कर


131

मैं एंड्रॉइड डेटाबाइंडिंग का उपयोग करके xml में "और &" "ऑपरेटर का उपयोग करने की कोशिश कर रहा हूं,

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

लेकिन मुझे संकलन त्रुटि मिली:

त्रुटि: कार्य के लिए निष्पादन विफल रहा ': app: dataBindingProcessLayoutsDevDebug'। org.xml.sax.SAXParseException; systemId: फ़ाइल: /User/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; लाइननंबर: 106; कॉलमनंबर: 89; इकाई नाम को तुरंत इकाई संदर्भ में 'और' का पालन करना चाहिए।

और एंड्रॉइड स्टूडियो में लाल हाइलाइट एरर "अनसैप्ड एंड नॉन टर्मिनेटेड कैरेक्टर"।

तो मुझे इसे कैसे ठीक करना चाहिए?

संपादित करें: उत्तर मिला, इन चरित्रों को बचाना होगा:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

मैंने देखा है कि मैं लेआउट xml फ़ाइलों में ">" और "<" का उपयोग कर सकता हूं।
हॉन्ग

जवाबों:


234

&&के रूप में प्रस्तुत किया जाना चाहिए &amp;&amp;

आधिकारिक डेटा बाइंडिंग गाइड में तुलना ऑपरेटरों के उदाहरण हैं जहां इन XML संस्थाओं का उपयोग किया जाता है, उदाहरण के लिए

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

संपादित करें

उत्तर में जिन उदाहरण अभिव्यक्तियों का मैंने उल्लेख किया है वे इस उत्तर के लिखे जाने के बाद से डॉक्स के अंग्रेजी संस्करण से गायब हो गए। वे डॉक्स जैसे स्पैनिश संस्करण के कुछ पुराने गैर-अंग्रेजी संस्करणों में जीवित रहते हैं।

किसी भी तरह से, मूल जवाब अभी भी मान्य है, क्योंकि XML में XML संस्थाओं का उपयोग XML में मानक है और इसका एंड्रॉइड के साथ कुछ भी नहीं है।


12
बाध्यकारी अभिव्यक्तियों में डोमेन लॉजिक का उपयोग न करें, इसके लिए आपके पास प्रीसेटर्स / कंट्रोलर हैं।
आर्टकॉनिग

2
@ ArtjomKönig यूआई में कुछ नियंत्रणों को छिपाने / दिखाने के बारे में क्या है? मैं नहीं लिख यूआई कोड के लिए पुस्तकालय बाध्यकारी डेटा का उपयोग
क्रस्टी

3
@Krusty Imlement एक विधि आपके प्रस्तुतकर्ता मेंMyControlV अदृश्य () है, जहां आप अपने डोमेन तर्क का उपयोग सही या गलत वापस करने के लिए करते हैं। इस विधि से बांधें।
आर्टकोएनिग

1
मुझे लगता है कि यदि आपके पास बहुत सारे बूलियन चर हैं तो यह समाधान ठीक है। अन्यथा आपके कोड में बहुत अधिक ऑब्जर्वेबल बूलियन होगा।
लेस्टर

@artkoenig तब आपको उन अतिरिक्त बूलियनों को बनाए रखना होगा जहाँ आप लेआउट का संदर्भ देते हैं। कीड़े का स्रोत।
अली काजी

36

HTML संस्थाओं की सूची

आप उपयोग नहीं कर सकते और या कुछ अन्य HTML इकाई एक्सएमएल में। इसलिए आपको भागने वाले चरित्र का उपयोग करना होगा।

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

एंड्रॉइड में अक्सर उपयोग किए जाने वाले HTML वर्ण निकाय:

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

यहाँ HTML संस्थाओं की एक पूरी सूची है।


17

लेआउट मार्क-अप में एस्केपिंग && एक बहुत खराब समाधान है। (ऑब्जेक्ट) मॉडल ऑब्जेक्ट पर एक विधि बनाना बेहतर है:

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

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

4
हालांकि यह एक अच्छा समाधान है, लेकिन दुर्भाग्य से यह तब नहीं बुलाया जाता है जब परिवर्तनशील मान बदल जाता है (InformPropertyChanged) और दृश्यता अपडेट नहीं की जाएगी।
बर्न कामप्ल

2
@BerndKampl उपयोगObservableBoolean isAdult
S1ngoooor

यह काम नहीं करने जा रहा है, यह केवल एक बार कॉल करेगा!
1

@BerndKampl इसका उपयोग कैसे करें, यह अभी भी एक बार कहा जाता है
कोडिंगटी

@CodingTT मेरे उत्तर को देखो, आपको इसे अपडेट करने के लिए कहीं न कहीं एक InformPropertyChanged कॉल की आवश्यकता होगी।
बर्न कम्प्ल

3

इस समस्या के लिए सबसे अच्छा समाधान जो मैं आ सकता था, वह एक नई बाइंडेबल विधि की शुरुआत कर रहा था।

इससे पहले:

item_recyclerview.xml:

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

MyDataModelClass: (जो मेरे विचार में आयोजित किया जा रहा है)

...
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: (जो मेरे विचार में आयोजित किया जा रहा है)

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

यह कोड BaseObservable classes का उपयोग कर रहा है, BR जनरेट की गई बाइंडिंग क्लास है। अधिक विस्तृत विवरण के लिए इस पोस्ट को देखें: medium.com/@jencisov/…
बर्न कम्प्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.