2013-04-15 6 views
28

मैं MeasureSpec.UNSPECIFIED और MeasureSpec.AT_MOST के बारे में थोड़ा उलझन में हूं। मुझे पता है कि match_parent या निरंतर आयाम मान layout_width या layout_height पर सेट किया गया है, MeasureSpec.EXACTLY दृश्य को मापते समय लागू किया जाएगा।MeasureSpec.UNSPECIFIED और MeasureSpec.AT_MOST कब लागू किया जाएगा?

फिर, MeasureSpec.UNSPECIFIED और MeasureSpec.AT_MOST के बारे में कैसे?

मेरे समझ क्योंकि wrap_content ऊंचाई या एक दृश्य की चौड़ाई का मतलब है सामग्री के आधार पर किसी भी आकार हो सकता है, कि, जब layout_width या layout_heightwrap_content के लिए सेट है, MeasureSpec.UNSPECIFIED लागू किया जाएगा है। लेकिन कई लेखों ने कहा कि wrap_content का अर्थ है MeasureSpec.AT_MOST। तो मैं उलझन में हूँ। मुझे नहीं पता कि MeasureSpec.AT_MOST कब लागू किया जाना चाहिए।

उत्तर

58

कैसे एक दृश्य आकार है की मूल परिभाषा इस प्रकार है:

MeasureSpec.EXACTLY - एक दृश्य वास्तव में यह अधिक से अधिक पिक्सेल कितना बड़ा यह वास्तव में होना चाहता है की परवाह किए बिना किया जाना चाहिए।

MeasureSpec.AT_MOST - यह दृश्य छोटा या छोटा होने पर यह आकार या छोटा हो सकता है।

MeasureSpec.UNSPECIFIED - एक दृश्य जो भी आकार दिखाना आवश्यक है उसे दिखाने के लिए यह आवश्यक हो सकता है।

MeasureSpec.AT_MOST बार देखा गया है कि WRAP_CONTENTकरने के लिए सेट किया गया है, तो माता-पिता को देखने के आकार में ही है करने के लिए लागू किया जाएगा। उदाहरण के लिए, आपका मूल दृश्य स्क्रीन आकार से बाध्य हो सकता है। यह बच्चे भी इस आकार से बंधे होंगे, लेकिन यह इतना बड़ा नहीं हो सकता है। इस प्रकार, अभिभावक दृश्य MeasureSpec को AT_MOST होने के लिए सेट करेगा जो बच्चे को बताता है कि यह 0 और स्क्रीन आकार के बीच कहीं भी हो सकता है। बच्चे को यह सुनिश्चित करने के लिए समायोजन करना होगा कि यह प्रदान की गई सीमाओं के भीतर फिट बैठता है।

विशेष मामलों में, सीमाएं कोई फर्क नहीं पड़ता। उदाहरण के लिए, ScrollViewScrollView के मामले में, बच्चे के दृश्य की ऊंचाई अप्रासंगिक है। इस प्रकार, यह बच्चों के लिए UNSPECIFIED की आपूर्ति करेगा जो बच्चों को बताता है कि वे जितना लंबा हो उतना लंबा हो सकते हैं। ScrollView उनके लिए ड्राइंग और प्लेसमेंट को संभालेगा।

+0

स्पष्टीकरण के लिए धन्यवाद में पैक करने और अनपैक करने के लिए प्रदान किया जाता है ... मैं एक रीसाइक्लिंग व्यू का उपयोग कर रहा हूं, और मेरे आइटम (गतिशील बाल दृश्यों को लपेटने) में उनकी ऊंचाई के रूप में 'wrap_content' है। सूची कुछ वस्तुओं को दोहराती है क्योंकि यह नहीं जानता कि ऊंचाई को ठीक नहीं किया गया है क्योंकि इसके दृश्य को कैसे भरना है। मुझे पता है कि मुझे 'मेजर()' को ओवरराइड करने की आवश्यकता हो सकती है, लेकिन मुझे नहीं पता कि मेरे मामले में इसे कैसे कार्यान्वित किया जाए। कोई विचार? – Atieh

+0

@Atieh, आप का मतलब है कि आप शेष RecyclerView स्पेस को किसी आइटम के साथ भरने की कोशिश कर रहे हैं? – DeeV

+0

वास्तव में नहीं, मेरा रीसायकलव्यू सूची में कुछ आइटम दोहरा रहा है। मेरे लॉग नेटवर्क कॉल से एन आइटम दिखाते हैं, लेकिन सूची में आइटम एम> एन। मैंने 'onMeasure()' के लिए डिफ़ॉल्ट कार्यान्वयन डीबग किया है और यह हर बार ऊंचाई के लिए 'AT_MOST' पर बंद हो जाता है। जैसा कि आपने समझाया है, पैरेंट व्यू (रीसाइक्लिंग व्यू) स्क्रीन से जुड़ा हुआ है (चौड़ाई और ऊंचाई के लिए match_parent) और मेरे आइटम में ऊंचाई के लिए 'wrap_content' है। – Atieh

0

ए मेजरस्पेक माता-पिता से बच्चे को पारित लेआउट आवश्यकताओं को समाहित करता है। प्रत्येक MeasureSpec चौड़ाई या ऊंचाई के लिए एक आवश्यकता का प्रतिनिधित्व करता है। एक MeasureSpec एक आकार और एक मोड शामिल है।तीन संभावित तरीके हैं:

अनिर्दिष्ट

The parent has not imposed any constraint on the child. It can be whatever size it wants. 

बिल्कुल

The parent has determined an exact size for the child. The child is going to be given those bounds regardless of how big it wants to be. 

AT_MOST

The child can be as large as it wants up to the specified size. 

ऑर्डर आवंटन को कम करने के लिए मापनस्पेक्स को इन्स के रूप में कार्यान्वित किया जाता है। इस वर्ग को int

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