2012-08-22 16 views
15

मैं रैखिक लेआउट की चौड़ाई और ऊंचाई कैसे प्राप्त कर सकता हूं जिसे xml में परिभाषित किया गया है fill_parent दोनों ऊंचाई और चौड़ाई में? मैंने ऑनमेजर विधि की कोशिश की है लेकिन मुझे नहीं पता कि यह सही मूल्य क्यों नहीं दे रहा है। ऑनक्वेट विधि खत्म होने से पहले मुझे इन मानों को एक गतिविधि में चाहिए।रन टाइम पर लेआउट ऊंचाई और चौड़ाई प्राप्त करें

+0

आईआईआरसी आपको मापने से पहले किसी भी चीज की ऊंचाई/चौड़ाई नहीं मिल सकती है। इसे तब सौंपा गया है जब साइज चेंज को बुलाया गया है, यदि आप ओवरराइड करते हैं तो सभी विचारों की ऊंचाई और चौड़ाई होना चाहिए – tom502

+0

@ tom502 क्या आप मुझे एक लिंक या कोड का टुकड़ा दे सकते हैं? यह बहुत उपयोगी होगा। – MGDroid

उत्तर

31

मान लीजिए मैं एक LinearLayout चौड़ाई एक्सएमएल में परिभाषित निकलना है। मुझे एक्सएमएल द्वारा इसका संदर्भ प्राप्त करना होगा। उदाहरण के तौर पर LinearLayoutl परिभाषित करें।

l = (LinearLayout)findviewbyid(R.id.l1); 
ViewTreeObserver observer = l.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       // TODO Auto-generated method stub 
       init(); 
      l.getViewTreeObserver().removeGlobalOnLayoutListener(
        this); 
     } 
    }); 

protected void init() { 
     int a= l.getHeight(); 
      int b = l.getWidth(); 
Toast.makeText(getActivity,""+a+" "+b,3000).show(); 
    } 
    callfragment(); 
} 
+1

जागरूक रहें! क्रेट खत्म होने से पहले यह आपको मूल्य नहीं देगा। अलहॉट मैंने इसे क्रिएट विधि के अंदर बुलाया था, इसकी ओवरराइड विधि देर से बुलाया जाएगा। तो ऐसा लगता है कि आपका आवेदन धीमा हो जाता है, लेकिन यह मेरा उद्देश्य हल करता है। – MGDroid

5

लेआउट के निर्माण के बाद चौड़ाई और ऊंचाई मान सेट किए जाते हैं, जब तत्वों को रखा जाता है तो वे मापा जाता है। साइज चेंज किए गए पहले कॉल पर पैरा 0 होगा, इसलिए यदि आप इसके लिए उस चेक का उपयोग करते हैं।

यहाँ थोड़ा और विस्तार https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw

और यहाँ http://developer.android.com/reference/android/view/View.html#Layout

यहाँ onLayout उपयोग करने के लिए कैसे:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = someView.getWidth(); 
    int height = someView.getHeight(); 
} 
2

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

एपीआई स्तर में जोड़ा गया 11

एक श्रोता है कि जब दृश्य परिवर्तन की सीमा से लेआउट प्रसंस्करण की वजह से बुलाया जाएगा जोड़ें। और पहले तो onGlobalLayout श्रोता को हटा दें और जो कुछ भी आप ऊंचाई के साथ करना चाहते हैं -

LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout); 
myLinearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      // Preventing extra work because method will be called many times. 
      if(height == (bottom - top)) 
       return; 

      height = (bottom - top); 
      // do something here... 
      } 
    }); 
3

यह काम पाने के लिए आपको कि क्या वांछित ऊंचाई मान 0 से बड़ा है की जाँच की जरूरत है। श्रोता निरंतर अपनी विधि को कॉल करता है और पहली कॉल द्वारा यह गारंटी नहीं दी जाती है कि दृश्य ठीक से मापा जाता है।

final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView); 
    parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int availableHeight = parent.getMeasuredHeight(); 
      if(availableHeight>0) { 
       parent.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       //save height here and do whatever you want with it 
      } 
     } 
    }); 
+0

यह चाल है - धन्यवाद। हटाए गए श्रोता कॉल को एपीआई स्तर 16 से हटा दिया गया है। यह पोस्ट वर्णन करता है कि पहले और बाद के एपीआई दोनों के लिए कॉल का समर्थन कैसे करें http://stackoverflow.com/a/23741481/2162226 – gnB

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