2012-02-08 7 views
28

के उपयोग को स्पष्ट कर सकते हैं मुझे किसी को यह बताने की ज़रूरत है कि मुझे <include> और <merge> का उपयोग कब सही ढंग से समझा जाए।कुछ <include> और <merge>

तो, मैं एक हैडर लेआउट जो मैं कुछ अन्य एक्सएमएल लेआउट में शामिल करना चाहते हैं:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
      <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     android:text="Header text" /> 
</LinearLayout> 

और मैं इसे किसी और एक्सएमएल में इस तरह से (जो सुंदर बुनियादी है) में शामिल हैं:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

यह अच्छी तरह से काम करेगा, इसके बारे में कोई समस्या नहीं है। लेकिन कोड को अनुकूलित करने के लिए, मुझे लेआउट में <merge> का उपयोग करना होगा। तो top layout एक टैग <LinearLayout> नहीं होना चाहिए, लेकिन यह इस तरह दिखना चाहिए:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"   
      android:text="Header text" /> 
</merge> 

मैं इस को सही ढंग से समझ में आ है?

+1

हां जो अच्छा दिखता है। हालांकि, मेरे अनुभव में, मुझे विलय की आवश्यकता नहीं है। मैं सिर्फ टेक्स्ट दृश्य को अपनी एक्सएमएल फ़ाइल में नहीं डाल सकता और उस फ़ाइल को शामिल नहीं कर सकता। कोई मर्ज आवश्यक नहीं है। – AedonEtLIRA

+0

हां, यह काम करेगा, लेकिन यह ** वास्तव में ** इसका उपयोग करने के लिए सुरक्षित है क्योंकि Google डेवलपर्स ने इस तरह के अभ्यास का सुझाव नहीं दिया है। मुझे डर है कि क्या होगा यदि वे मर्ज टैग को पहचानने वाले किसी चीज़ को बदलने का फैसला करते हैं। – sandalone

+1

@ सैंडलोन जैसा कि आपको एक्सएमएल को नए मानक में अपडेट करना होगा ... शुरुआत के बाद से एंड्रॉइड में कई अवमूल्यन विधियां रही हैं, इसलिए यह वास्तव में कुछ ऐसी चीज नहीं है जिसे किसी को ध्यान में रखना चाहिए। – Jonny2Plates

उत्तर

19

हाँ आप इसे सही ढंग से समझ गए हैं। पेड़ में स्तरों की संख्या को कम करने के लिए merge छद्म पैरेंट तत्व के रूप में प्रयोग किया जाता है। बस यह link देखें, यह merge का बहुत अच्छा स्पष्टीकरण देता है।
अपने हेडर फाइल

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
       <include android:id="@+id/header" layout="@layout/top" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" 
      /> 
</LinearLayout> 

<LinearLayot> कोई फर्क नहीं करता अपनी फ़ाइल अन्य फ़ाइल आप का उल्लेख में शामिल है जब। तो इसके बजाय merge का उपयोग करना एक अच्छी बात है।
चूंकि एक्सएमएल में आपको एक एकल मूल तत्व का उपयोग करना होगा और शेष एक्सएमएल तत्वों को इसमें शामिल किया जाना चाहिए, आपको merge का उपयोग एकल मूल तत्व के रूप में करना चाहिए और अनावश्यक पैरेंट लेआउट जोड़ने से बच सकते हैं।
जब आप अपनी सामग्री को शामिल करते हैं, उसमें लेआउट की परिभाषा के अनुसार अलग-अलग लेआउट लागू करना चाहते हैं तो बस 'विलय' से बचें।

+0

धन्यवाद। आपके द्वारा सुझाए गए लिंक ने मेरे सिर में भ्रम पैदा किया :), और यह है कि मैं आप लोगों के साथ दोबारा जांचना चाहता हूं। – sandalone

+0

@bergnam: भ्रम पैदा करने के लिए खेद है। मैंने इसे वास्तव में सहायक पाया। अगर मैं किसी अन्य अच्छे लिंक में आया तो साझा करूंगा। – xyz

+0

यह ठीक है। यह सब के बाद आधिकारिक लिंक है, और अन्य सभी ग्रंथ उस पर आधारित हैं। – sandalone

18

मेरी समझ से यह मर्ज तत्व को दृश्य पदानुक्रम में उच्च तत्व के रूप में सेट करेगा। शामिल करें बस पूरे दृश्य समूह को वहां रखेगा।

मर्ज के साथ

:: तो अपने उदाहरण देखने पदानुक्रम का उपयोग कर की तरह दिखना चाहिए

LinearLayout (root) 
| 
TextView 
साथ

में शामिल हैं:

LinearLayout (root) 
| 
LinearLayout 
| 
TextView 

तो आपको लगता है कि आप नहीं है दृश्य पदानुक्रम में एक अतिरिक्त LinearLayout होगा जरुरत। हालांकि, कभी-कभी आपको उस मध्यवर्ती दृश्य की आवश्यकता होती है। आपके मामले में, आप नहीं करेंगे, क्योंकि लिनियरलाइट्स में एक ही लेआउट पैराम हैं और कोई अन्य अंतर नहीं है।

+0

अच्छा बिंदु, लेकिन ऐसे मामले दुर्लभ हैं। इसके लिए उपरोक्त – sandalone

0

<merge /> टैग आपके दृश्य पदानुक्रम में अनावश्यक दृश्य समूहों को खत्म करने में मदद करता है जब किसी अन्य के भीतर एक लेआउट शामिल होता है। उदाहरण के लिए, यदि आपका मुख्य लेआउट एक लंबवत रैखिकलाइट है जिसमें दो लेआउट में लगातार दो विचारों का पुन: उपयोग किया जा सकता है, तो फिर से उपयोग करने योग्य लेआउट जिसमें आप दो विचारों को रखते हैं, के लिए अपने मूल दृश्य की आवश्यकता होती है। हालांकि, पुन: प्रयोज्य लेआउट के लिए रूट के रूप में एक और रैखिकलाइट का उपयोग करने के परिणामस्वरूप लंबवत रैखिकलायआउट के अंदर एक लंबवत रैखिकलाइट होगा। नेस्टेड लीनियरलाउट आपके यूआई प्रदर्शन को धीमा करने के अलावा कोई वास्तविक उद्देश्य नहीं देता है।

ऐसे अनावश्यक दृश्य समूह को शामिल करने से बचने के लिए, आप फिर से उपयोग करने योग्य लेआउट के रूट दृश्य के रूप में <merge> तत्व का उपयोग कर सकते हैं। उदाहरण के लिए:

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/add"/> 

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/delete"/> 

अब, जब आप एक और लेआउट में इस लेआउट में शामिल हैं (टैग का उपयोग कर), प्रणाली तत्व पर ध्यान नहीं देता और दो बटन लेआउट में सीधे देता है, के स्थान पर टैग।

संबंधित मुद्दे