दिलचस्प पोस्ट
सी # सूची देखें, मैं कॉलम 2, 3 और 4 आदि में आइटम कैसे जोड़ूं? लंबितइंन्टेंट पहली सूचना के लिए सही तरीके से काम करता है लेकिन शेष के लिए गलत तरीके से काम करता है JQuery के साथ onclick कार्रवाई रोकें मैं एंड्रॉइड सपोर्ट लाइब्रेरी के लिए जावाडॉक कैसे सक्षम कर सकता हूं? UIButton: चुने हुए हाइलाइट स्थिति के लिए छवि सेट करें Google मानचित्र एकल देश सीमा रूबी: कैसे एक मणि लिखने के लिए? कैसे iPython आउटपुट में HTML एम्बेड करें? एंड्रॉइड फ़ोल्डर में कोई डिबग नहीं है। कुंजीस्टोर एक्सप्रेशन <Func <T, DateTime> अभिव्यक्ति के लिए कैसे करें <Func <T, Object >> स्ट्रिंग में शब्द को हाइलाइट करें, अगर इसमें कीवर्ड शामिल है मैं एंड्रॉइड एम्यूलेटर में एक्सीलरोमीटर कैसे अनुकरण कर सकता हूं? एक छद्म तत्व में सामग्री के रूप में एसवीजी का उपयोग करने का कोई तरीका है: या इससे पहले: एक स्थैतिक आरंभीकरण ब्लॉक में एक योग्य स्थिर अंतिम चर की अनुमति क्यों नहीं है? अपरिचित SSL संदेश, सादा टेक्स्ट कनेक्शन? अपवाद

रनटाइम पर एंड्रॉइड व्यू के आकार का निर्धारण करना

मेरी गतिविधि बनने के बाद मैं अपने एंड्रॉइड ऐप में एनीमेशन को देखने के लिए कोशिश कर रहा हूं। ऐसा करने के लिए, मुझे दृश्य के वर्तमान आकार को निर्धारित करने की आवश्यकता है, और फिर मौजूदा आकार से नए आकार में स्केल करने के लिए एनीमेशन सेट अप करें। यह भाग रनटाइम पर किया जाना चाहिए, क्योंकि उपयोगकर्ता के इनपुट के आधार पर दृश्य अलग-अलग आकारों में तराजू है। मेरे लेआउट को XML में परिभाषित किया गया है

यह एक आसान काम की तरह लगता है, और इसके बारे में बहुत सारे सवाल हैं, हालांकि कोई भी मेरी समस्या का समाधान नहीं करता है, जाहिर है तो शायद मैं कुछ स्पष्ट लापता हूँ मैं अपने विचारों को संभालता हूं:

ImageView myView = (ImageView)getWindow().findViewById(R.id.MyViewID); 

यह काम ठीक है, लेकिन जब getWidth() , getHeight() , getMeasuredWidth() , getLayoutParams().width , आदि, वे सभी वापसी 0 पर कॉल करते समय। getMeasuredWidth() , लेकिन इसका कोई प्रभाव नहीं है।

मैंने इन विधियों को कॉल करने और ऑब्जेक्ट को डिबगर में मेरी गतिविधि के onPostCreate() में और onPostCreate() का onPostCreate() । रनटाइम पर इस दृश्य के सटीक आयामों को मैं कैसे समझ सकता हूँ?

Solutions Collecting From Web of "रनटाइम पर एंड्रॉइड व्यू के आकार का निर्धारण करना"

प्रथम लेआउट की प्रतीक्षा करने के लिए ViewTreeObserver का उपयोग करें। केवल पहले लेआउट के बाद मिलेगा Width () / getHeight () / getMeasuredWidth () / getMeasuredHeight () काम

 ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); viewWidth = view.getWidth(); viewHeight = view.getHeight(); } }); } 

परिदृश्य पर निर्भर करते हुए वास्तव में कई समाधान होते हैं:

  1. लेआउट चरण समाप्त होने के बाद, सुरक्षित तरीके से, दृश्य खींचने से पहले ही काम करेगा:
 public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) { final OnPreDrawListener preDrawListener = new OnPreDrawListener() { @Override public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); runnable.run(); return true; } }; view.getViewTreeObserver().addOnPreDrawListener(preDrawListener); } 
  1. कुछ मामलों में, दृश्य के आकार को मैन्युअल रूप से मापने के लिए पर्याप्त है:
 view.measure(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); int width=view.getMeasuredWidth(); int height=view.getMeasuredHeight(); 
  1. अगर आपके पास एक कस्टम दृश्य है जिसे आपने बढ़ाया है, तो आप "मापन" विधि पर अपना आकार प्राप्त कर सकते हैं, लेकिन मुझे लगता है कि यह केवल कुछ मामलों पर अच्छा काम करता है:
 protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int newHeight= MeasureSpec.getSize(heightMeasureSpec); final int newWidth= MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 

क्या आपको वास्तव में स्क्रीन पर दृश्य दिखाई देने से पहले getWidth() बुला रहे हैं?

नए एंड्रॉइड डेवलपर्स द्वारा बनाई गई एक आम गलती है कि उसके निर्माता के अंदर एक दृश्य की चौड़ाई और ऊंचाई का उपयोग करना। जब किसी व्यू के कन्स्ट्रक्टर को फोन किया जाता है, तो एंड्रॉइड अभी तक नहीं जानता कि दृश्य कितना बड़ा होगा, इसलिए आकार शून्य पर सेट किया गया है। असली आकार लेआउट चरण के दौरान गिना जाता है, जो निर्माण के बाद होता है लेकिन कुछ भी तैयार होने से पहले। जब आप ज्ञात होते हैं, तो आप मूल्यों के बारे में सूचित करने के लिए onSizeChanged() विधि का उपयोग कर सकते हैं, या आप बाद में getWidth() और getHeight() तरीकों का उपयोग कर सकते हैं, जैसे कि onDraw() विधि में

@ एमबीएर्ड की सलाह के आधार पर, मुझे ImageView onLayout() क्लास उप- onLayout() और onLayout() द्वारा एक व्यावहारिक समाधान मिला। मैंने तब एक पर्यवेक्षक इंटरफ़ेस बनाया जो मेरी गतिविधि को लागू किया और कक्षा में खुद के संदर्भ को पारित कर दिया, जिसने इसे गतिविधि को बताने की इजाजत दी, जब यह वास्तव में आकार बदल गया था।

मैं 100% आश्वस्त नहीं हूं कि यह सबसे अच्छा समाधान है (इसलिए मैं अभी तक यह उत्तर सही नहीं बता रहा हूं), लेकिन यह काम करता है और दस्तावेज़ीकरण के अनुसार पहली बार जब कोई दृश्य का वास्तविक आकार पा सकता है।

एपीआई <11 (एपीआई 11 में व्यू। ओनलेआउट चेंगल लिस्टनर सुविधा शामिल है) दृश्य को ओवरराइड करने के माध्यम से लेआउट प्राप्त करने के लिए कोड है:

 public class CustomListView extends ListView { private OnLayoutChangedListener layoutChangedListener; public CustomListView(Context context) { super(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (layoutChangedListener != null) { layoutChangedListener.onLayout(changed, l, t, r, b); } super.onLayout(changed, l, t, r, b); } public void setLayoutChangedListener( OnLayoutChangedListener layoutChangedListener) { this.layoutChangedListener = layoutChangedListener; } } public interface OnLayoutChangedListener { void onLayout(boolean changed, int l, int t, int r, int b); } 

आप इस सवाल को देख सकते हैं आप View की पोस्ट () विधि का उपयोग कर सकते हैं।

यह मेरे लिए onClickListener में काम करता है:

 yourView.postDelayed(new Runnable() { @Override public void run() { yourView.invalidate(); System.out.println("Height yourView: " + yourView.getHeight()); System.out.println("Width yourView: " + yourView.getWidth()); } }, 1); 

मैं भी आसपास getMeasuredWidth() गया था getMeasuredWidth() और getMeasuredHeight() getHeight() और लंबे समय के लिए getWidth() प्राप्त करें ………. बाद में मैंने पाया कि दृश्य की चौड़ाई और ऊँचाई onSizeChanged() पर प्राप्त करना सबसे अच्छा है ऐसा करने का तरीका …….. आप गतिशील रूप से onSizeChanged( ) विधि को ओवरराइड करते onSizeChanged( अपने वर्तमान चौड़ाई और वर्तमान दृश्य प्राप्त कर सकते हैं।

शायद उस पर एक नज़र रखना चाहें, जिसमें एक विस्तृत कोड स्निपेट है नया ब्लॉग पोस्ट: एंड्रॉइड में कस्टम व्यू (विस्तारित व्यू) की चौड़ाई और ऊंचाई आयाम कैसे प्राप्त करें http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

कोड के नीचे का प्रयोग करें, यह दृश्य का आकार दे रहा है।

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.e("WIDTH",""+view.getWidth()); Log.e("HEIGHT",""+view.getHeight()); } 

मेरे लिए perfekt काम करता है:

  protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); CTEditor ctEdit = Element as CTEditor; if (ctEdit == null) return; if (e.PropertyName == "Text") { double xHeight = Element.Height; double aHaight = Control.Height; double height; Control.Measure(LayoutParams.MatchParent,LayoutParams.WrapContent); height = Control.MeasuredHeight; height = xHeight / aHaight * height; if (Element.HeightRequest != height) Element.HeightRequest = height; } }