2012-10-09 7 views
7

मैं कम से कम बॉयलरप्लेट कोड के साथ पुन: उपयोग या "उपनाम" लेआउट का आकलन करना चाहता हूं।लेआउट उपनाम के बारे में गलत एंड्रॉइड दस्तावेज़?

ऐसा लगता है कि Android documentation about layout aliases गलत है, और निश्चित रूप से असंगत प्रतीत होता है।

<resources> 
    <item name="main" type="layout">@layout/main_twopanes</item> 
</resources> 

यदि मैं यह संकलन करने की कोशिश, मैं एक Attribute is missing the Android namespace prefix त्रुटि मिलती है: प्रलेखन के इस खंड के लिए एक उदाहरण के रूप में निम्नलिखित लेआउट फ़ाइल को दर्शाता है। यहां तक ​​कि resources तत्व को नाम स्थान को जोड़ने के बाद, मैं error: Error: String types not allowed (at 'type' with value 'layout').

Elsewhere in the Android documentation, वे उर्फ ​​लेआउट के लिए एक अलग और उचित रूप में, उल्टा और गलत रास्ता दिखा:

एक मौजूदा लेआउट के लिए एक उपनाम बनाने के लिए, का उपयोग करें तत्व, <merge> में लपेटा गया। उदाहरण के लिए:

<?xml version="1.0" encoding="utf-8"?> 
<merge> 
    <include layout="@layout/main_ltr"/> 
</merge> 

इस LogCat E/AndroidRuntime(1558): android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true में निम्न त्रुटि में परिणाम चल रहा है। तो यह त्रुटि इस तथ्य को मजबूत करने के लिए प्रतीत होती है कि यह <include><merge> जोड़ी एक गलती होनी चाहिए, क्योंकि इसे एक अनावश्यक माता-पिता View की आवश्यकता होती है।

अंततः <merge> documentation है, जो कि पूर्व दिशा के विपरीत लगता है, जो शीर्ष स्तर <merge><include/></merge> के उलटा रूप का कोई उल्लेख नहीं करता है।

इस तरह के एक निरर्थक दृश्य समूह सहित बचने के लिए, आप के बजाय तत्व का उपयोग कर सकते फिर से प्रयोग करने योग्य लेआउट के लिए रूट दृश्य के रूप में। उदाहरण के लिए:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

    <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"/> 

</merge> 
+1

[पहली विधि] (http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAlias ​​फ़िल्टर) मेरे लिए संकलित और ठीक काम करने लगता है। क्या आपके पास नवीनतम एसडीके उपकरण स्थापित हैं? – Joe

+0

@ जो इसे सत्यापित करने के लिए धन्यवाद! यह समाप्त होता है मैंने निर्देशों को ध्यान से नहीं पढ़ा। मैंने ऐसा किया जो मैंने सोचा था कि मुझे करना चाहिए - लेआउट.एक्सएमएल को 'मूल्य-बड़े' फ़ोल्डर के बजाय 'लेआउट-बड़े' के अंदर रखें। –

उत्तर

7

पहली तकनीक काम करता है, तो आप सिर्फ सही फ़ोल्डर में अपने <resources> फ़ाइल डाल करने के लिए की है। यह values फ़ोल्डर्स में layout फ़ोल्डरों में होना चाहिए जैसा कि आप <include> के माध्यम से लेआउट का उपयोग करते समय हो सकते हैं।

उदाहरण के लिए, मान लें कि आपके पास editor.xml नामक एक लेआउट है जो layout फ़ोल्डर में रहता है। मान लीजिए कि आप small और normal स्क्रीन आकारों पर एक विशेष लेआउट का उपयोग करना चाहते हैं। अगर आपको खुद को दोहराने की परवाह नहीं है, तो आप इस लेआउट को layout-small और layout-normal फ़ोल्डरों में कॉपी और पेस्ट करेंगे और प्रत्येक फ़ोल्डर में editor.xml नाम दें। तो आपके पास editor.xml नाम की तीन फाइलें होंगी।

यदि आप स्वयं को दोहराना नहीं चाहते हैं, तो आप मुख्य layout फ़ोल्डर में विशेष लेआउट रखेंगे और कहेंगे, compact_editor.xml। फिर आपऔर values-normal फ़ोल्डर्स में layout.xml नाम की एक फ़ाइल बनायेंगे। प्रत्येक फ़ाइल में लिखा होगा:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <item name="editor" type="layout">@layout/compact_editor</item> 
</resources> 

मैं अन्य दो समस्याओं के बारे में एक documentation issue मामला दर्ज किया है।

+1

"मर्ज का यह उलटा उपयोग अन्यथा अनियंत्रित प्रतीत होता है" - कारण 'की आवश्यकता है कि किसी कारण से '' मूल तत्व के रूप में समर्थित नहीं है। अन्यथा, '' का उपयोग सामान्य है। '' कहता है "यहां विजेट्स और कंटेनर का एक गुच्छा है जिसे कुछ अनिश्चित माता-पिता में जाना है", ' 'रूट एक्सएमएल तत्व के रूप में कार्यरत है (क्योंकि XML को एक की आवश्यकता है)। इस मामले में, "विजेट और कंटेनरों का समूह" किसी अन्य लेआउट संसाधन में संग्रहीत किया जाता है, इसलिए ''। – CommonsWare

+0

@ कॉमन्सवेयर उचित लगता है, लेकिन यह आपकी व्याख्या है '' की आपकी समझ के आधार पर यह [वास्तविक दस्तावेज़ीकरण] नहीं है (http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge) । –

+0

ठीक है, वास्तविक दस्तावेज वास्तव में एक पुरस्कार जीतने वाला नहीं है, लेकिन वहां कुछ भी नहीं है जो मैं देखता हूं कि मैंने जो लिखा है उसके विपरीत है। – CommonsWare

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