2013-09-05 6 views
5

मुझे सर्वर से एक्सएमएल लेआउट गतिशील रूप से लोड करने की आवश्यकता है। लेआउट इन्फ्लेटर ने विधियों को फुलाया है जो XmlPullParser का उपयोग करते हैं। मैंने कोशिश की है, लेकिन यह काम नहीं करता है।XmlResourceParser कार्यान्वयन

एंड्रॉइड स्रोत कोड में देखते हुए, यह पता चला है कि उन inflate विधियों को XmlResourceParser के साथ बुलाया जाता है। कार्यान्वयन एंड्रॉइड का उपयोग XmlBlock.Parser है, लेकिन यह एक सार्वजनिक एपीआई नहीं है।

क्या कोई XmlResourceParser सार्वजनिक कार्यान्वयन है जिसका उपयोग मैं कर सकता हूं?

+0

आप जो करने का प्रयास कर रहे हैं वह सर्वर से कुछ संसाधन फ़ाइल डाउनलोड करें, फिर इसे पढ़ें जैसे कि यह आपके एप्लिकेशन का संसाधन था, है ना? –

+0

लेआउटइनफ्लेटर की विधि का उपयोग करने का प्रयास करते समय आप क्या त्रुटि प्राप्त कर रहे हैं? –

+0

सही, मैं सर्वर से कुछ संसाधन फ़ाइल डाउनलोड करने और ऐप में इसका उपयोग करने की कोशिश कर रहा हूं। – Mugur

उत्तर

4

आप Android documentation में वर्णित की तरह एक पारंपरिक XmlPullParser उपयोग कर सकते हैं:

InputStream yourRemoteLayout = ...; 
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
XmlPullParser parser = factory.newPullParser(); 
parser.setInput(yourRemoteLayout, "someEncoding"); 
AttributeSet attributes = Xml.asAttributeSet(parser); 

कृपया देखो क्या अधिक जानकारी के लिए XmlPullParser documentation में विस्तार से बताया है।


संपादित करें: LayoutInflater#inflate() प्रलेखन से:

Important For performance reasons, view inflation relies heavily on pre-processing of XML files that is done at build time. Therefore, it is not currently possible to use LayoutInflater with an XmlPullParser over a plain XML file at runtime. 

मैं क्या लगता है, यह है कि हो सकता है आप LayoutInflater.Factory2 का अपना स्वयं का कार्यान्वयन करना चाहिए अगर एंड्रॉयड के अपने ही preprocessed संसाधनों पर निर्भर हैं।

+0

आपके द्वारा दिए गए उदाहरण में, MyResource एक int है। मेरे पास ऐसा int नहीं है क्योंकि संसाधन ऐप का हिस्सा नहीं था। – Mugur

+0

inflate विधि XmlResourceParser का उपयोग करता है। और इसका एकमात्र कार्यान्वयन XmlBlock.Parser है जो कुछ मूल कोड का उपयोग करता है और सार्वजनिक API का हिस्सा नहीं है। इसलिए, मेरी समस्या। – Mugur

+0

ओह क्षमा करें, मैंने ईमानदारी से int नहीं देखा। मैं कुछ कामकाज खोजूंगा। मैंने आपके द्वारा बात की गई XmlResourceParser के बारे में जांच की और उसे नहीं मिला।प्रलेखन XmlPullParser की बात करता है और स्रोत कोड इसे कास्ट करने का कोई प्रयास नहीं करता है (मैंने 4.0.3 देखा है, लेकिन मुझे कुछ याद आ सकता है)। क्या आप XmlResourceParser के लिए कुछ और सटीक संदर्भ दे सकते हैं? –

1

वास्तव में, आप गतिशील रूप से एक्सएमएल लेआउट लोड नहीं कर सकते हैं। एंड्रॉइड सिस्टम को XmlResourceParser की आवश्यकता नहीं है। जब एंड्रॉइड यूई सिस्टम एक संसाधन को बढ़ाता है, तो यह सिर्फ पार्सर को इसके निजी कार्यान्वयन में परिवर्तित करता है, एक बाइनरी एक्सएमएल स्रोत पार्सर (मैं कक्षा का नाम भूल गया)।

1 साल पहले, मैंने कोशिश की, कई बार बिताया। तो, मेरे समय को फिर से बर्बाद मत करो।

+0

यदि आप एंड्रॉइड स्रोत कोड पर नज़र डालते हैं, तो आप देखेंगे कि LayoutInflater.inflate विधि को पैरामीटर के रूप में XmlResourceParser के साथ बुलाया जाता है। सिद्धांत रूप में, XmlResourceParser का कार्यान्वयन मेरी समस्या का समाधान करेगा, लेकिन मुझे एंड्रॉइड बाइनरी एक्सएमएल प्रारूप के लिए कहीं भी विनिर्देश नहीं मिल सका। इसलिए, मैं आपसे सहमत नहीं हूं कि यह नहीं किया जा सकता है, इस समय यह बहुत जटिल है, इसलिए, मैं आपके दूसरे बिंदु से सहमत हूं कि अब इसे करने का प्रयास करने का समय बर्बाद है। – Mugur

+0

मुझे पता है, लेकिन यह केवल व्यू के कन्स्ट्रक्टर को देखता है, यह 'Context.obtainStyledAttributes' द्वारा' विशेषता 'को संसाधित करता है, और फिर 'Resources.obtainStyledAttributes'। इस विधि में: 'XmlBlock.Parser पार्सर = (XmlBlock.Parser) सेट'। यदि आप XmlPullParser को लागू करते हैं, तो आप इस ऑब्जेक्ट को देखने के लिए कैसे प्रदान कर सकते हैं? या आप एट्रिब्यूटसेट को अनदेखा कर सकते हैं और अपने आप को सभी को लागू कर सकते हैं। लेकिन ध्यान दें कि, व्यू का कन्स्ट्रक्टर कई '@ hide' api का उपयोग करता है जिसे आप एक्सेस नहीं कर सकते हैं। – afpro

1

प्रदर्शन कारणों से, मुद्रास्फीति देखें निर्माण समय पर किए गए एक्सएमएल फाइलों के प्री-प्रोसेसिंग पर भारी निर्भर करता है। इसलिए, वर्तमान में रनटाइम पर एक सादे एक्सएमएल फ़ाइल पर XmlPullParser के साथ लेआउटइनफ्लेटर का उपयोग करना संभव नहीं है।

ऐसा नहीं कहा जाता कि यह नहीं किया जा सकता है। लेकिन आपको सही प्रारूप में लाने के लिए xml फ़ाइल पर बिल्ड टूल्स चलाने की आवश्यकता होगी। फिर आप शायद 'संदर्भ' और 'संसाधन' का नकल कर सकते हैं जो डाउनलोड किए गए डेटा को 'लेआउट इन्फ्लूटर'

+0

किसी भी विचार "कैसे करें 'संदर्भ' और 'संसाधन'" के बारे में कोई विचार? – Mugur

1

हाँ में उपयोग किया जाता है, अभी इसके Itat Droid के साथ संभव है।

इस सार को एक नज़र डालें:

https://groups.google.com/forum/#!topic/itsnat/13nl0P12J_s

यह भारी विकास के अंतर्गत अभी भी है, लेकिन सबसे महत्वपूर्ण सुविधाओं को पहले से ही लागू किया जाता है।

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