অ্যান্ড্রয়েড ডেটাবাইন্ডিং “&&” লজিকাল অপারেটর ব্যবহার করে


131

আমি এক্সএমএল এবং "&&" অপারেটরটি অ্যান্ড্রয়েড ডেটাবাইন্ডিং ব্যবহার করে ব্যবহার করার চেষ্টা করছি,

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

তবে আমি সংকলন ত্রুটি পেয়েছি:

ত্রুটি: কার্য ': অ্যাপ্লিকেশন: ডেটাবাইন্ডিংপ্রসেসলয়আউটগুলি ডেভিডব্যাগ' এর জন্য কার্যকর করা ব্যর্থ। org.xml.sax.SAXParseException; systemId: ফাইল: / ব্যবহারকারীর /পাথ / অ্যাপ / বিল্ড / ইনটারমিডিয়াটস / রেস / ডাবলড / দেব / দেবুগ / স্ক্রিনআউট / ফ্র্যাগমেন্ট_স্পেস.এক্সএমএল; লাইন নম্বর: 106; কলাম নম্বর: 89; সত্তার নাম অবশ্যই অবিলম্বে সত্তা রেফারেন্সে '&' অনুসরণ করবে।

এবং অ্যান্ড্রয়েড স্টুডিওতে রেড হাইলাইট ত্রুটি "অনাকাঙ্ক্ষিত ও বা অবিরত অক্ষর"।

তাহলে আমি কীভাবে এটি ঠিক করব?

সম্পাদনা করুন: উত্তরটি পাওয়া গেছে, এই চরিত্রটি পালাতে হবে:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

আমি লক্ষ্য করেছি যে আমি ">" এবং "<" লেআউট এক্সএমএল ফাইলগুলিতে ব্যবহার করতে পারি।
হংকং

উত্তর:


234

&&হিসাবে রেন্ডার করা উচিত &amp;&amp;

অফিসিয়াল ডেটা বাইন্ডিং গাইডের তুলনা অপারেটরগুলির উদাহরণ রয়েছে যেখানে এই এক্সএমএল সত্তা ব্যবহৃত হয়, উদাহরণস্বরূপ

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

সম্পাদন করা

আমি উত্তরে উল্লেখ করা উদাহরণের মত প্রকাশগুলি এই উত্তরটি লেখা হওয়ার পরে ডক্সের ইংরেজি সংস্করণ থেকে অদৃশ্য হয়ে গেল। স্প্যানিশ সংস্করণের মতো ডক্সের কিছু পুরানো অ-ইংরাজী সংস্করণে তারা টিকে আছে।

যে কোনও উপায়ে, মূল উত্তরটি এখনও বৈধ, কারণ এক্সএমএলে এক্সএমএল সত্তার ব্যবহার এক্সএমএলে মানক এবং অ্যান্ড্রয়েডের সাথে এর কোনও যোগসূত্র নেই।


12
বাঁধাইয়ের এক্সপ্রেশনগুলিতে ডোমেন যুক্তি ব্যবহার করবেন না, আপনার এর জন্য প্রিসেটর / নিয়ামক রয়েছে।
আর্টকোনিগ

2
@ আর্টজমকনিগ আপনি যদি ইউআই-তে কিছু নিয়ন্ত্রণ লুকিয়ে রাখতে / প্রদর্শন করতে হয় তবে কী হবে? আমি ইউআই কোড না লেখার জন্য ডেটা বাইন্ডিং লাইব্রেরি ব্যবহার করি
ক্রুস্টি

3
@ ক্রাস্টি ইমিমেন্ট একটি পদ্ধতি আপনার উপস্থাপকের মধ্যে রয়েছে MyControlVisible (), যেখানে আপনি আপনার ডোমেন যুক্তি ব্যবহার করে সত্য বা মিথ্যা ফিরে আসার জন্য। এই পদ্ধতিতে আবদ্ধ।
আর্টকোনিগ

1
আমি মনে করি আপনার যদি খুব বেশি বুলিয়ান ভেরিয়েবল থাকে তবে এই সমাধানগুলি ভাল। অন্যথায় আপনার কোডটিতে প্রচুর পরিমাণে অবজারেবলবুলিয়ান.সেট থাকবে
লেস্টার

@ আর্টকোনিগ তারপরে আপনার যেই লেআউটের রেফারেন্স রয়েছে সেখানেই আপনাকে সেই অতিরিক্ত বুলিয়ানগুলি বজায় রাখতে হবে। বাগের উত্স।
আলী কাজী

36

এইচটিএমএল সত্ত্বার তালিকা

আপনি এক্সএমএলে & বা অন্য কোনও HTML সত্তা ব্যবহার করতে পারবেন না । সুতরাং আপনাকে পালানোর চরিত্রটি ব্যবহার করতে হবে।

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

এইচটিএমএল চরিত্র সত্তা প্রায়শই অ্যান্ড্রয়েডে ব্যবহৃত হয়:

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

এইচটিএমএল সত্ত্বার একটি সম্পূর্ণ তালিকা এখানে


17

লেআউট মার্ক-আপ এন্ড এস্পেপিং একটি খুব দুর্বল সমাধান। (ভিউ) মডেল অবজেক্টে একটি পদ্ধতি তৈরি করা ভাল:

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

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

4
যদিও এটি একটি ভাল সমাধান, এটি দুর্ভাগ্যক্রমে কল হয় না যখন ভেরিয়েবলের মান পরিবর্তিত হয় (notifyPropertyChanged) এবং দৃশ্যমানতা আপডেট হবে না।
বারেন্ড কাম্পল

2
@ বারেন্ডক্যাম্পল ব্যবহার করুনObservableBoolean isAdult
এস

এটি কাজ করে না, এটি কেবল একবার কল হবে!
কোডিংটিটি

@ বার্ডক্যাম্পল কীভাবে এটি ব্যবহার করবেন, এটি এখনও একবার কল করা হয়
কোডিংটিটি

@ কোডিংটিটি আমার উত্তরটি দেখুন, এটি আপডেট করার জন্য আপনার কোথাও একটি বিজ্ঞপ্তিপ্রোপার্টি চেঞ্জড কল প্রয়োজন হবে।
বার্যান্ড কাম্পল

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

এই কোডটি বেসঅজার্ভেবল ক্লাস ব্যবহার করছে, বিআর হ'ল জেনারেটেড বাইন্ডিং ক্লাস। আরও বিশদ ব্যাখ্যার জন্য এই পোস্টটি দেখুন: मध्यम.com
বার্নড ক্যাম্পল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.