दृश्यता सेट करने के लिए डेटा बाइंडिंग का उपयोग करें


102

Viewकस्टम चर का उपयोग करके दृश्यता सेट करने की कोशिश की जा रही है , लेकिन त्रुटि होती है Identifiers must have user defined types from the XML file. visible is missing it:। क्या डेटा बाइंडिंग का उपयोग करके दृश्यता सेट करना संभव है? धन्यवाद।

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

जवाबों:


232

जैसा कि एंड्रॉइड डेवलपर गाइड में कहा गया है , आपको इसे इस तरह से करने की आवश्यकता है:

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

6
और "बिक्री" के लिए मूल्य कैसे सेट करें?
— रॉबिनहुड

तो आपका मतलब है कि स्ट्रिंग के चर के लिए मूल्य "बिक्री" कैसे निर्दिष्ट किया जाए?
— डेविड आर्टमैन

बिल्कुल सही! मैं समस्या का सामना कर रहा हूं। कृपया साझा करें मैं तुलना करूंगा और फिर आपको बता दूंगा।
— रोबिनहुड

40
लानत है! मैं सिली आयात कैसे याद किया । धन्यवाद कर दिया।
— रॉबिनहुड

अरे! किसी भी विचार क्यों स्क्रॉल पर स्थिति गड़बड़? एडाप्टर
— रोबिनहुड

58

आपके लेआउट में:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

आपके ViewModel जावा कोड में:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

3
आपने मुझे मामूली सिरदर्द से बचाया
— कोएन वान लोवरेन

2
आपके डेटा मॉडल को कार्य करने के लिए अवलोकन योग्य होना चाहिए।
— यशख

इसमें शामिल हुए बिना मेरे लिए काम किया @Bindable। जब मैंने शामिल किया कि मुझे अलग-अलग बाध्यकारी त्रुटियाँ मिल रही थीं, जिसमें विस्तार करने का सुझाव भी शामिल था BaseObservable। यहाँ अच्छा सूचक
— जीन बो

2
स्वीकृत उत्तर होना चाहिए! यह मेरे लिए पूरी तरह से काम किया है!
— क्रिस

के लिए कोई सुझाव LiveData<Boolean>?
— सौरव बागची

41

समस्या यह है कि है visibilityहै एक Integerपर Viewवर्ग, इस का मतलब है कि आप इस काम करने के लिए दो तरीके हैं:

  1. View.VISIBLEऔर View.GONEस्थिरांक का उपयोग करें । https://developer.android.com/topic/libraries/data-binding/index.html#imports
  2. एक कस्टम सेटर को परिभाषित करने के लिए visibilityहै कि एक लेता है Boolean। https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

संभावित कार्यान्वयन:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

जिससे <FrameLayout android:visibility="@{sale}"/>काम बनेगा ।


4
जहां यह आपके लिए सुविधाजनक है, एनोटेशन प्रोसेसर संकलन के दौरान स्वचालित रूप से उनका पता लगाता है।
— किसका डे

धन्यवाद, मैं इसे अपने
— बंधन

लेकिन मूल्य बिक्री कैसे सेट करें?
— EslamWael74

1
मैं टैग्स को शामिल करने के लिए एक ही दृष्टिकोण कैसे लागू कर सकता हूं?
— ज़ेफ़र सेलोग्लू

1
@ EslamWael74 आपने अपने जावा / कोटलिन कोड में बाइंडिंग के माध्यम से बिक्री का मूल्य निर्धारित किया है। वैल बाइंडिंग जैसा कुछ = MyClassBinding.inflate (...), और फिर आप बस बाइंडिंग को सही कर सकते हैं। सच =।
— मैट रॉबर्टसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.