2016-10-05 6 views
11

मैं include का उपयोग करके एक ही दृश्य में अपने कई लेआउट का उपयोग करना चाहता हूं। मान लें कि मेरे पास custom.xml है जिसमें कुछ TextView एस शामिल हैं।टैग और डेटा शामिल करें बाइंडिंग

custom.xml:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/text2" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

मैं parent.xml में इस लेआउट कई बार शामिल किया है:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

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

    <include layout="@layout/custom" 
     android:id="@+id/layout2"/> 
</LinearLayout> 

अब मैं इस लेआउट करने के लिए अपने डेटा मॉडल बाध्य करने के लिए चाहते हैं, लेकिन समस्या यह है कि मैं डॉन 'है टी layout1 और layout2 पर दो अलग-अलग डेटा मॉडल को बाध्य करने के बारे में पता है क्योंकि उनमें से दोनों को एक लेआउट से custom.xml से पुनर्प्राप्त किया गया है। जहाँ तक मुझे पता के रूप में मैं अपने XML लेआउट में इस टैग को जोड़ सकते हैं:

<data> 
     <variable name="user" type="com.myproject.model.User"/> 
    </data> 

लेकिन मैं custom.xml को दो अलग-अलग डेटा मॉडल बाध्य करने के लिए की जरूरत है।

मेरा प्रश्न है कि एक दृश्य में एक बार कई बार एक लेआउट कैसे शामिल किया जाए और डेटा बाध्यकारी का उपयोग करके उन्हें अलग-अलग डेटा पास किया जाए? कुछ लेआउट में डेटा पास करने की तरह कुछ लेकिन एक मॉडल को स्थिर रूप से एक xml करने के लिए बाध्यकारी नहीं है।

मैं भी this सवाल जो बिल्कुल एक ही समस्या थी है लेकिन चूंकि डेटा बाइंडिंग Android के नए संस्करणों में जारी किया गया है मैं डाटा बाइंडिंग का उपयोग कर एक ही मुद्दे को हल करने के लिए एक तरह से मांग कर रहा हूँ मिल गया। यहाँ यह सवाल है कि मैं स्पष्टीकरण के लिए उद्धृत किया है का हिस्सा है:

उदाहरण के लिए, मैं एक सावधानी से गढ़ी लेआउट है कि मैं मेरे विचार में तीन बार प्रदर्शित करने के लिए चाहते हैं। उन सभी मामलों को अलग-अलग मानों की आवश्यकता होगी। चूंकि include मूल रूप से उस XML को लेता है और इसे पेस्ट करता है, तो मुझे कुछ और शक्तिशाली की आवश्यकता होगी।

+0

लेआउट ही कर रहे हैं, और केवल डेटा बदल रहा है, यही कारण है कि आप एक कस्टम recycleView का उपयोग करने पर विचार न तो: content_main.xml इस प्रकार देखना चाहिए? –

+0

क्योंकि मैं दो अलग-अलग डेटा मॉडल पास करना चाहता हूं उदाहरण के लिए एक उपयोगकर्ता है और दूसरा पता है लेकिन दोनों मॉडल अपने डेटा को दिखाने के लिए एक ही लेआउट का उपयोग कर रहे हैं –

उत्तर

22

आप पास कर सकते हैं कि से parent.xml

<include layout="@layout/custom" 
    android:id="@+id/layout1" 
    app:user="@{object of user1`}"/> 

<include layout="@layout/custom" 
    android:id="@+id/layout2" 
    app:user="@{object of user2`}"/> 

यहाँ आप parent.xml

से User वस्तु पारित करने के लिए की जरूरत है सुनिश्चित करें कि आप custom.xml में <data>

<data> 
    <variable name="user" type="com.myproject.model.User"/> 
</data> 

Here है वें से संबंधित विस्तृत उत्तर वें है, यह

+0

आपके उत्तर के लिए धन्यवाद यह अंतिम उत्तर के करीब है लेकिन क्या यह दो पास करना संभव है custom.xml के लिए मॉडल के प्रकार (उदाहरण के लिए एक उपयोगकर्ता और दूसरा पता है)? –

+0

हां, उस स्थिति में आपको 'custom.xml' –

+0

में दो चर लेने की आवश्यकता है? <चर नाम = "उपयोगकर्ता" type = "com.myproject.model.User" /><चर नाम = "पता" type = "com.myproject.model.Address" />

0
समस्या

उल्लेख है कि शामिल लेआउट के बारे में सोचा जा रहा है नहीं है एक डेटा-बाउंड लेआउट, take a look here हल करने के लिए कि यह कैसे

+1

आपके उपयोगी लिंक के लिए धन्यवाद लेकिन मुझे लगता है कि आपको अपने उत्तर में और विवरण शामिल करना होगा –

4

हम जानते हैं कि कैसे POJO नाम और उसके प्रकार का उपयोग करने के undertstand के रूप में एक्सएमएल पर हम पेरेंट व्यू के रूप में setContentView() में उपयोग कर रहे हैं। हम इस प्रकार हम संसाधन से किसी भी लेआउट शामिल कर रहे हैं, तो include टैग पर ध्यान देना चाहिए:

<?xml version="1.0" encoding="utf-8"?> 

<layout xmlns:bind="http://schemas.android.com/apk/res-auto"> 

    <data> 

     <variable 
      name="user" 
      type="exapmpe.model.User" /> 
    </data> 

    <android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/AppTheme.AppBarOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/AppTheme.PopupOverlay" /> 

     </android.support.design.widget.AppBarLayout> 

     <include 
      layout="@layout/content_main" 
      bind:user="@{user}" /> 

    </android.support.design.widget.CoordinatorLayout> 

</layout> 

यहाँ हम bind विशेषता का उपयोग सामग्री स्क्रीन पर विस्तृत जानकारी दिखाने के लिए वस्तु पारित करने के लिए है।कृपया सुनिश्चित करें कि ऑब्जेक्ट का नाम bind:user="@{user} जैसे दोनों स्थानों पर होना चाहिए।

<?xml version="1.0" encoding="utf-8"?> 

<layout> 

    <data> 

     <variable 
      name="user" 
      type="exapmpe.model.User" /> 
    </data> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/content_main" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{user.firstName + user.lastName}" /> 

    </RelativeLayout> 

</layout> 
संबंधित मुद्दे