मैं रैखिक लेआउट की चौड़ाई और ऊंचाई कैसे प्राप्त कर सकता हूं जिसे xml में परिभाषित किया गया है fill_parent दोनों ऊंचाई और चौड़ाई में? मैंने ऑनमेजर विधि की कोशिश की है लेकिन मुझे नहीं पता कि यह सही मूल्य क्यों नहीं दे रहा है। ऑनक्वेट विधि खत्म होने से पहले मुझे इन मानों को एक गतिविधि में चाहिए।रन टाइम पर लेआउट ऊंचाई और चौड़ाई प्राप्त करें
उत्तर
मान लीजिए मैं एक LinearLayout
चौड़ाई एक्सएमएल में परिभाषित निकलना है। मुझे एक्सएमएल द्वारा इसका संदर्भ प्राप्त करना होगा। उदाहरण के तौर पर LinearLayout
l
परिभाषित करें।
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();
}
जागरूक रहें! क्रेट खत्म होने से पहले यह आपको मूल्य नहीं देगा। अलहॉट मैंने इसे क्रिएट विधि के अंदर बुलाया था, इसकी ओवरराइड विधि देर से बुलाया जाएगा। तो ऐसा लगता है कि आपका आवेदन धीमा हो जाता है, लेकिन यह मेरा उद्देश्य हल करता है। – MGDroid
लेआउट के निर्माण के बाद चौड़ाई और ऊंचाई मान सेट किए जाते हैं, जब तत्वों को रखा जाता है तो वे मापा जाता है। साइज चेंज किए गए पहले कॉल पर पैरा 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();
}
आप अपने लेआउट में लेआउट चेंज श्रोता पर जोड़ सकते हैं और नवीनतम ऊंचाई और चौड़ाई या अंतिम परिवर्तन से पहले भी प्राप्त कर सकते हैं।
एपीआई स्तर में जोड़ा गया 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...
}
});
यह काम पाने के लिए आपको कि क्या वांछित ऊंचाई मान 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
}
}
});
यह चाल है - धन्यवाद। हटाए गए श्रोता कॉल को एपीआई स्तर 16 से हटा दिया गया है। यह पोस्ट वर्णन करता है कि पहले और बाद के एपीआई दोनों के लिए कॉल का समर्थन कैसे करें http://stackoverflow.com/a/23741481/2162226 – gnB
आईआईआरसी आपको मापने से पहले किसी भी चीज की ऊंचाई/चौड़ाई नहीं मिल सकती है। इसे तब सौंपा गया है जब साइज चेंज को बुलाया गया है, यदि आप ओवरराइड करते हैं तो सभी विचारों की ऊंचाई और चौड़ाई होना चाहिए – tom502
@ tom502 क्या आप मुझे एक लिंक या कोड का टुकड़ा दे सकते हैं? यह बहुत उपयोगी होगा। – MGDroid