एंड्रॉइड डेटा बाइंडिंग में टैग का उपयोग किया जाता है


116

अद्यतन नोट:

उपरोक्त उदाहरण ठीक से काम करता है , क्योंकि रिलीज 1.0-rc4 ने अनावश्यक चर की आवश्यकता के मुद्दे को तय किया।

मूल प्रश्न:

मैं बिल्कुल वैसा ही करता हूं जैसा कि प्रलेखन में वर्णित है और यह काम नहीं करता है:

main.xml:

<layout xmlns:andr...
    <data>
    </data>
       <include layout="@layout/buttons"></include>
....

buttons.xml:

<layout xmlns:andr...>
    <data>
    </data>
    <Button
        android:id="@+id/button"
        ...." />

MyActivity.java:

 ... binding = DataBindingUtil.inflate...
binding.button; ->cannot resolve symbol 'button'

बटन कैसे प्राप्त करें?

जवाबों:


205

समस्या यह है कि शामिल लेआउट को डेटा-बाउंड लेआउट के रूप में नहीं सोचा जा रहा है। इसे एक के रूप में कार्य करने के लिए, आपको एक चर पास करना होगा:

buttons.xml:

<layout xmlns:andr...>
  <data>
    <variable name="foo" type="int"/>
  </data>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"
            app:foo="@{1}"/>
....

तब आप बटन को अप्रत्यक्ष रूप से बटन फ़ील्ड के माध्यम से एक्सेस कर सकते हैं:

MainBinding binding = MainBinding.inflate(getLayoutInflater());
binding.buttons.button

1.0-rc4 (अभी जारी) के अनुसार, आपको अब वैरिएबल की आवश्यकता नहीं है। आप इसे सरल कर सकते हैं:

buttons.xml:

<layout xmlns:andr...>
  <Button
    android:id="@+id/button"
    ...." />

main.xml:

<layout xmlns:andr...
...
   <include layout="@layout/buttons"
            android:id="@+id/buttons"/>
....

6
1.0-rc4 अब अनावश्यक चर की आवश्यकता की समस्या को ठीक करता है। अब आप बस का उपयोग कर सकते हैं <include layout="@layout/buttons" android:id="@+id/buttons"/>:। आपको अभी भी आईडी की आवश्यकता है ताकि यह आपके लिए एक सार्वजनिक क्षेत्र का उत्पादन करे ताकि आप बटन दृश्य तक पहुंच सकें।
जॉर्ज माउंट

1
हालांकि किसी और को लेआउट पर घटनाओं पर क्लिक करने से समस्या होती है?
निलज़ोर

5
समर्थन के साथ डेटाबाइंडिंग। डेवलपर
.android.com

1
यहां मुख्य बिंदु यह है कि बटन संदर्भ प्राप्त करना याद रखें, आपको binding.{id of include tag}.buttonइसके बजाय करने की आवश्यकता है binding.button। यह पता लगाने के लिए मुझे कुछ समय लगा।
ऋषभ Jan६

1
@NeonWarge डेवलपर . android.com/topic/lbooks/data-binding/… पर एक पूर्ण उदाहरण है । यह जोड़ता है "डेटा बाइंडिंग समर्थन नहीं करता है एक मर्ज तत्व के प्रत्यक्ष बच्चे के रूप में"
इवान

38

आसान पूरा उदाहरण

बस idशामिल लेआउट के लिए सेट , और उपयोग करें binding.includedLayout.anyView

यह उदाहरण एक मान को <includeकोड में शामिल विचारों तक पहुँचने और पहुँचने में मदद करता है ।

चरण 1

आपके पास शामिल लेआउट के layout_common.xmlलिए पास Stringहोना चाहते हैं ।

आप पैदा करेगा Stringलेआउट में चर और इस का उल्लेख Stringकरने के लिए TextView

<data>
    // declare fields
    <variable
        name="passedText"
        type="String"/>
</data>

<TextView
    android:id="@+id/textView"
    ...
    android:text="@{passedText}"/> //set field to your view.

चरण 2

इस लेआउट को पैरेंट लेआउट में शामिल करें। एक idशामिल लेआउट दें , ताकि हम उसे बाध्यकारी श्रेणी में उपयोग कर सकें। अब आप स्ट्रिंग passedTextको अपने <includeटैग में पास कर सकते हैं ।

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        ..
        >

        <include
            android:id="@+id/includedLayout"
            layout="@layout/layout_common"
            app:passedText="@{@string/app_name}" // here we pass any String 
            />

    </LinearLayout>
</layout>
  • अब binding.includedLayout.textViewआप अपनी कक्षा में उपयोग कर सकते हैं ।
  • ऊपर दिए गए लेआउट में शामिल करने के लिए आप किसी भी चर को पास कर सकते हैं।

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    binding.includedLayout.textView.setText("text");

नोट दोनों लेआउट (माता-पिता और शामिल) binding layout, के साथ लिपटे होने चाहिए<layout


आपने अपने उत्तर में सेटटेक्स्ट इवेंट को प्रोग्रामेटिक रूप से हैंडल किया, टेक्स्ट व्यू के बजाय अगर यह एक बटन होता, तो आप इसके क्लिक इवेंट को कैसे हैंडल करते। मुझे पता है कि प्रोग्रामेटिक binding.includedLayout.button.setOnClickListenerरूप से विकल्प होगा, लेकिन क्या होगा अगर मैं onClickXML में विशेषता का उपयोग करना चाहता हूं। अपने आप ?
iCCC

आप OnClickListenerशामिल लेआउट में पास कर सकते हैं । यहां तक ​​कि आप बंधन में कुछ भी पारित कर सकते हैं। इस उत्तर की जांच करें, यदि आपको अधिक सहायता की आवश्यकता है, तो मुझे बताएं। stackoverflow.com/a/51722829/6891563
खेमराज

1
जब मैं ऐसा करता हूं, मुझे सिर्फ एक खाली क्षेत्र मिलता है passedText। एकमात्र अंतर यह है कि मैं MainActivity कोड को शामिल नहीं करता हूं क्योंकि मैं स्ट्रिंग संसाधन को <<> में शामिल करना चाहता हूं और इसे ऐसे ही छोड़ देता हूं। यह हमेशा खाली क्यों होता है?
एलिप्टिका 5


3

आप अपने बाइंड वर्क को अपने काम में शामिल कर सकते हैं, बस इसमें एक आईडी जोड़ सकते हैं जैसे:

<include
            android:id="@+id/loading"
            layout="@layout/loading_layout"
            bind:booleanVisibility="@{viewModel.showLoading}" />

2

बस अपने शामिल लेआउट के लिए एक आईडी सेट करें

    <include
        android:id="@+id/layout"
        layout="@layout/buttons" />

फिर

BUTTONSBINDING binding = yourMainBinding.layout;

BUTTONSBINDING रेस / लेआउट / बटन.एक्सएमएल है

अभी :

binding.button.setText("simple_Way");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.