2016-01-14 7 views
27

Android data binding guide किसी गतिविधि या खंड के भीतर बाध्यकारी मानों पर चर्चा करता है, लेकिन क्या कस्टम दृश्य के साथ डेटा बाध्यकारी करने का कोई तरीका है?कस्टम दृश्य के साथ एंड्रॉइड डेटा बाध्यकारी

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.mypath.MyCustomView 
     android:id="@+id/my_view" 
     android:layout_width="match_parent" 
     android:layout_height="40dp"/> 

</LinearLayout> 

my_custom_view.xml साथ:

<layout> 

<data> 
    <variable 
     name="myViewModel" 
     type="com.mypath.MyViewModelObject" /> 
</data> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@{myViewModel.myText}" /> 

</LinearLayout> 

</layout> 

यद्यपि यह संभव प्रतीत होता है कस्टम स्थापना करके यह करने के लिए कस्टम दृश्य पर जिम्मेदार बताते हैं, इस जल्दी से बोझिल बन जाएगा

मैं की तरह कुछ करना चाहते हैं अगर बांधने के लिए बहुत सारे मूल्य हैं।

क्या मैं ऐसा करने का प्रयास कर रहा हूं?

+0

आप custome दृश्य बढ़ा-चढ़ाकर के बाद अपने MyCustomView कक्षा में डेटा बाइंडिंग की कोशिश की? –

+0

मैंने इसे पूरा करने के लिए कुछ चीजों की कोशिश की, लेकिन बाध्यकारी कार्यों को किसी गतिविधि या खंड में निहित जानकारी की आवश्यकता होती है। उनके उदाहरणों ने कस्टम दृश्य के भीतर इसे पूरा करने के तरीके पर नमूना नहीं दिया। इसे पूरा करने के तरीके पर एक संक्षिप्त कोड स्निपेट की बहुत सराहना की जाएगी। – Dave

+0

एफवाईआई: मुझे लगता है कि एक्सएमएल लेआउट फाइलों को सम्मेलन द्वारा अंडरस्कोर नोटेशन के साथ नामित किया गया है। –

उत्तर

31

अपने कस्टम दृश्य में, लेआउट लेकिन आप आमतौर पर बढ़ और विशेषता के लिए एक सेटर प्रदान आप सेट करना चाहते:

<layout xmlns...> 
    <data> 
     <variable 
      name="myViewModel" 
      type="com.mypath.MyViewModelObject" /> 
    </data> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <com.mypath.MyCustomView 
      android:id="@+id/my_view" 
      app:myViewModel="@{myViewModel}" 
      android:layout_width="match_parent" 
      android:layout_height="40dp"/> 

    </LinearLayout> 
</layout> 

:

private MyCustomViewBinding mBinding; 
public MyCustomView(...) { 
    ... 
    LayoutInflater inflater = (LayoutInflater) 
     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mBinding = MyCustomViewBinding.inflate(inflater); 
} 

public void setMyViewModel(MyViewModelObject obj) { 
    mBinding.setMyViewModel(obj); 
} 

तो लेआउट में आप इसे में उपयोग उपर्युक्त में, ऐप के लिए एक स्वचालित बाध्यकारी विशेषता बनाई गई है: myViewModel क्योंकि setMyViewModel नाम के साथ एक सेटटर है।

+0

धन्यवाद! एंड्रॉइड स्टूडियो से होने वाले संघर्ष का हिस्सा अपने कैश को अमान्य करने की आवश्यकता है, और परियोजना मध्यस्थ फाइलों से छुटकारा पाने और नई बाध्यकारी फाइलें उत्पन्न करने के लिए कई बार पुनर्निर्मित की गई है। यह जानना मुश्किल था कि सभी लाल के साथ क्या गलत हो रहा था। – Dave

+1

टाइप 'MyCustomViewBinding' किस प्रकार बनाया गया है? –

+0

MyCustomViewBinding डेटा बाध्यकारी ढांचे के हिस्से के रूप में एक एनोटेशन प्रोसेसर के माध्यम से उत्पन्न होता है। एक्सएमएल फ़ाइल (डेव ने MyCustomView.xml का उपयोग किया, लेकिन वह वास्तव में my_custom_view.xml था, क्योंकि संसाधन संसाधन फ़ाइलों के लिए सभी कम केस होना चाहिए) MyCustomViewBinding (ऊंट cased, बाध्यकारी के साथ प्रत्यय) का एक डिफ़ॉल्ट बाध्यकारी वर्ग नाम का कारण बनता है। आप बाइंडिंग क्लास नाम को भी कस्टमाइज़ कर सकते हैं: http://developer.android.com/tools/data-binding/guide.html#custom_binding_class_names –

4

सबसे पहले, ऐसा न करें अगर यह कस्टम दृश्य पहले से ही <include> पर एक अन्य लेआउट, जैसे गतिविधि आदि में है, तो आपको टैग अप्रत्याशित मूल्य के बारे में अपवाद मिलेगा। डेटा बाध्यकारी पहले से ही बाध्यकारी चला गया है, तो आप सेट कर रहे हैं।

क्या आपने बाइंड चलाने के लिए onFinishInflate का उपयोग करने का प्रयास किया था? (Kotlin उदाहरण)

override fun onFinishInflate() { 
    super.onFinishInflate() 
    this.dataBinding = MyCustomBinding.bind(this) 
} 

ध्यान रखें कि अगर आप अपने दृश्य में बाध्यकारी उपयोग करें, यह प्रोग्रामेटिक रूप से बनाने के लिए, कम से कम यह बहुत भी आप कर सकते हैं अगर दोनों का समर्थन करने के जटिल होगा नहीं कर सकेंगे।

1

Following the solution presented by george एंड्रॉइड स्टूडियो में आलेखीय संपादक कस्टम दृश्य प्रस्तुत करने में सक्षम नहीं था। कारण यह है कि कोई दृश्य वास्तव में निम्न कोड में हवा भरी जाती है:

public MyCustomView(...) { 
    ... 
    LayoutInflater inflater = (LayoutInflater) 
     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mBinding = MyCustomViewBinding.inflate(inflater); 
} 

मुझे लगता है कि बाध्यकारी मुद्रास्फीति संभालती है, फिर भी चित्रमय संपादक यह पसंद नहीं आया।

मेरे विशिष्ट उपयोग मामले में मैं एक फ़ील्ड बांधना चाहता था, न कि संपूर्ण दृश्य मॉडल। मैं साथ आया (कोटलिन आने वाले):

class LikeButton @JvmOverloads constructor(
     context: Context, 
     attrs: AttributeSet? = null, 
     defStyleAttr: Int = 0 
) : ConstraintLayout(context, attrs, defStyleAttr) { 

    val layout: ConstraintLayout = LayoutInflater.from(context).inflate(R.layout.like_button, this, true) as ConstraintLayout 

    var numberOfLikes: Int = 0 
     set(value) { 
      field = value 
      layout.number_of_likes_tv.text = numberOfLikes.toString() 
     } 
} 

जैसे बटन में एक छवि और एक टेक्स्ट व्यू शामिल है। टेक्स्ट व्यू में पसंद की संख्या होती है, जिसे मैं डेटा बाध्यकारी के माध्यम से सेट करना चाहता हूं।

<views.LikeButton 
    android:id="@+id/like_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:numberOfLikes="@{story.numberOfLikes}" /> 

अतिरिक्त पठन: https://medium.com/google-developers/android-data-binding-custom-setters-55a25a7aea47

0

तुम क्या कर रहे आधार पर, मैं करने की कोशिश की

निम्नलिखित एक्सएमएल में विशेषता के रूप में numberOfLikes के लिए सेटर का उपयोग करके, डेटा स्वचालित रूप से बाध्यकारी संघ बनाता है MyCustomBinding.bind(this) करें और यह मेरे लिए अब काम नहीं किया है।बाध्यकारी पहले से ही हुआ था, लेकिन इसके बजाय हम क्या करते हैं।

private MyCustomBinding binding; 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 

    binding = DataBindingUtil.getBinding(this); //got the binding! 
    MyViewModelObject model = MyViewModelObject.get("myText"); 

    binding.setVariable(BR.myViewModel, model); 
} 
संबंधित मुद्दे