2010-05-13 13 views
51

प्रस्तुत करने से पहले एक दृश्य को मापने के लिए मुझे यह पता लगाना होगा कि इसे अपने माता-पिता से जोड़ने के बाद कितना बड़ा दृश्य होगा।इसे

मैं इस विधि अधिरोहित है

onMeasure(int, int); 

लेकिन यह इस पद्धति की तरह शुरू हो जाती है केवल जब मैं वास्तव में यह करने के लिए अपने कस्टम दृश्य जोड़ने का उपयोग कर लग रहा है कंटेनर है:

addView(myView); 

क्या आपको लगता है नहीं है दृश्य को प्रस्तुत करने से पहले इस जानकारी को प्राप्त करने का एक तरीका? असल में मुझे इसे जोड़ने से पहले एक्ट्यूअल आकार को जानने की ज़रूरत है और यदि दृश्य में अधिक निश्चित मात्रा लगेगी तो दृश्य को संलग्न न करें।

कोई भी?

उत्तर

7

OnMeasure आप देखें का आकार नहीं बताता है। इसके बजाए, यह आपके कस्टम व्यू को पैरेंट व्यू द्वारा लागू कुछ बाधाओं को प्रदान करके अपना आकार सेट करने के लिए कहता है।

इस SDK दस्तावेज़ से है:

पहली जोड़ी मापा जाता चौड़ाई और ऊंचाई मापा के रूप में जाना जाता है। ये आयाम निर्धारित कितना बड़ा एक दृश्य अपनी मूल के भीतर होने का चाहता है (लेआउट देखना अधिक जानकारी के लिए।) मापा जाता आयाम getMeasuredWidth() और getMeasuredHeight() कॉल करके प्राप्त किया जा सकता।

दूसरी जोड़ी को चौड़ाई और ऊंचाई के रूप में जाना जाता है, या कभी-कभी चौड़ाई और ड्राइंग ऊंचाई ड्राइंग करता है। ये आयाम ड्राइंग समय और लेआउट के बाद, स्क्रीन पर दृश्य के वास्तविक आकार को परिभाषित करते हैं। ये मान हो सकते हैं, लेकिन मापित चौड़ाई और ऊंचाई से भिन्न होने की आवश्यकता नहीं है। चौड़ाई और ऊंचाई द्वारा प्राप्त की जा सकती है GetWidth() और getHeight()।

लेआउट के बाद आप अपने कस्टम व्यू के अंतिम आकार को पाने के लिए getWidth() और getHeight() को कॉल कर सकते हैं।

0

मुझे एक ही समस्या है। मुझे लगता है कि इसे पहले प्रस्तुत करना एकमात्र तरीका है, तो के बाद इसे हटाएं यदि यह आकार की स्थिति को पूरा करता है। थोड़ा अजीब तरीका लगता है, लेकिन एंड्रॉइड केवल ड्राइंग के बाद आयामों को जानता है।

82

आप चौड़ाई और ऊंचाई अपनी गतिविधि से पहले प्राप्त करना चाहते हैं उसके दृश्य पदानुक्रम में जोड़ा, मापा जाता है और इसे बाहर रखी आप getMeasuredWidth() या getMeasuredHeight() कॉल करने से पहले View अपने आप पर measure() फोन करना होगा है।

माप के बाद मापा चौड़ाई और ऊंचाई सेट की गई है (जो बदले में onMeasure() पर कॉल करती है) वे इस बिंदु से पहले 0 वापस आ जाएंगे। आपको MeasureSpec से measure(..) पर आपूर्ति करना होगा जो आपकी आवश्यकताओं के आधार पर अलग-अलग होंगे।

MeasureSpecs कि बच्चों को कोई कमी लागू करने के लिए अनुमति देने के लिए खुद को

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY); 
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY); 

महत्वपूर्ण बिंदु की तरह लग रहे। (नई एपीआई में बदल दिया गया है) चौड़ाई ऊपर में पारित या तो स्पष्ट px या ViewGroup.LayoutParams.WRAP_CONTENT या ViewGroup.LayoutParams.FILL_PARENT.

इसका भी ध्यान देने योग्य है जब आपके विचार वास्तविक गंतव्य पदानुक्रम MeasureSpec कि पारित हो जाएगा में मापा जाता है लायक हो सकता है measure() को पर ViewGroups लेआउट तर्क के आधार पर कॉन्फ़िगर किया जाएगा। इसे पहली बार एक से अधिक कहा जा सकता है यदि पहली उपाय vals मान्य नहीं हैं जब इस मूल दृश्य समूह/इसके स्वयं के लेआउट constraits/किसी भी भाई बच्चे के विचारों की बाधाओं के संदर्भ में माना जाता है। viewGroupmeasure() पर कॉल करने के लिए measure() पर कॉल करने के लिए मापने के आकार पर निर्भर किसी भी तर्क को लागू करने से पहले यह उपरोक्त समाधान से अंतिम measuredWidth & height प्राप्त करने के लिए कठिन होगा (स्थिति के आधार पर), लेकिन सभी मामलों में मैंने उपर्युक्त तकनीक का उपयोग किया है उद्देश्य को फिट करें, लेकिन वे अपेक्षाकृत सरल हैं। यदि आपको वास्तव में संदर्भ में मापने की आवश्यकता है तो आपको शायद onLayout() के बाद ऐसा करना चाहिए और स्पष्ट रूप से requestLayout() में कोई भी परिवर्तन सेट कर दिया गया है।

+4

देखें आपका महत्वपूर्ण बिंदु गलत है, आप मेममेजरस्पेक (int, int) के पहले पैरा के रूप में WRAP_CONTENT या FILL_PARENT को पास नहीं कर सकते हैं। मान 0 से अधिक या 1073741823 से कम होना चाहिए। – worked

+2

ऐसा लगता है कि इस विधियों को इत्यादि 17 में बदल दिया गया है। मैंने लगभग 5 साल पहले इसका उत्तर दिया :) – Dori

+0

@ डोररी [** MeasureSpec.makeMeasureSpec() **] (https : //developer.android.com/reference/android/view/View.MeasureSpec.html) को नए प्रतिबंधों को दर्शाने के लिए भी अपडेट किया गया है। क्या आप उस "महत्वपूर्ण बिंदु" खंड में स्ट्राइक-थ्रू या कुछ डालने पर ध्यान देंगे? –

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