2010-01-13 13 views
9

मैं एक वर्ग है कि एक दृश्य फैली बना लिया है:getLayout पैराम वापस लौट रहे हैं?

public class BoardView extends View { 

और मैं आवेदन के main.xml फ़ाइल में चौड़ाई और BoardView की ऊंचाई निर्दिष्ट किया है:

<mypackage.BoardView 
     android:id="@+id/board"   
     android:layout_width="270px" 
     android:layout_height="270px" /> 

मैं बोर्डव्यू के कन्स्ट्रक्टर से बुलाए गए फ़ंक्शन से चौड़ाई और ऊंचाई प्राप्त करने का प्रयास कर रहा है। यहां मैं यह कर रहा हूं:

ViewGroup.LayoutParams p = this.getLayoutParams(); 
int h = p.height; 

लेकिन getLayoutParams हमेशा शून्य लौट रहा है। कोई विचार क्यों यह काम नहीं कर रहा है?

उत्तर

13

मुझे यकीन नहीं है कि लेआउट पैरामीटर (यानी लेआउट पैराम्स का उदाहरण) दृश्य के निर्माता के अंदर उपलब्ध होगा। मुझे लगता है, यह केवल "लेआउट" पास किए जाने के बाद ही उपलब्ध होगा। How Android draws views here. के बारे में पढ़ें, this thread एक बिंदु के मापित आयाम प्राप्त करने के लिए वास्तव में आपको कब इंगित करना चाहिए जब पिन बिंदु की कोशिश करता है।

ध्यान दें कि यदि आप लेआउट एक्सएमएल के माध्यम से प्राप्त विशेषता मान प्राप्त करने में रुचि रखते हैं, तो आप AttributeSet उदाहरण का उपयोग अपने कन्स्ट्रक्टर के लिए एक तर्क के रूप में पारित कर सकते हैं।

public MyView(Context context, AttributeSet attrs){ 
// attrs.getAttributeCount(); 
// attrs.getAttributeXXXvalue(); 
} 
+2

सहायता के लिए धन्यवाद। मुझे वास्तव में आवश्यक एक्सएमएल विशेषता मान था जिसे मैं कन्स्ट्रक्टर में एट्रिब्यूटसेट से प्राप्त कर सकता था। यहां मेरा (बदसूरत) समाधान है: स्ट्रिंग एनएस = "http://schemas.android.com/apk/res/android"; स्ट्रिंग वी = attrs.getAttributeValue (एनएस, "layout_height"); // कनवर्ट करें "270px" से "270" v = v.replace ("px", ""); // रनटाइम पर यह मान "270.0" v = v.replace ("0", ""); int एच = Integer.parseInt (v); – tronman

14

दृश्य के बाद उसके माता-पिता में लेआउट पैरामीटर उपलब्ध हैं। अपने कोड को व्यू कन्स्ट्रक्टर से onAttachedToWindow() पर ले जाने का प्रयास करें क्योंकि getLayoutParams()null वापस नहीं आएगा।

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    assert getLayoutParams() != null; 
} 
संबंधित मुद्दे