2013-01-20 9 views
7

इस समस्या पर बहुत सारे प्रश्न हैं, लेकिन अधिकांश मेरे प्रश्न का उत्तर देने के लिए बहुत विशिष्ट हैं।एप्लिकेशन लाइफसाइक्ल में आप किस समय लेआउट माप का उपयोग कर सकते हैं?

मेरे पास GoogleMap है जो मैं अपने कैमरे को कुछ सीमाओं में फिट करने के लिए कहता हूं।

java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

तो चलो सार इस समस्या को किसी भी View रहे हैं: शायद नहीं बहुत आश्चर्य की बात है, मैं कोई त्रुटि मिलती है।

यह 'लेआउट' घटना वास्तव में कब होती है? उदाहरण के लिए onMeasure()Activity Lifecycle में दिखाई नहीं देता है। मेरे लेआउट-आवश्यकता विधि को कॉल करना सुरक्षित कब है?

उत्तर

9

संपादित करें:

अद्यतन मानचित्र API में इस विशेष problen का समाधान करने के लिए आप

map.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 50)); 

का उपयोग करना चाहिए किसी भी के लिए अन्य दृश्य, और पुराने मैप्स एपीआई

साइमन के उत्तर में ViewTreeObserver.OnGlobalLayoutListener का उपयोग करें।

तुम भी View.post() उपयोग कर सकते हैं View संदेश कतार में कुछ जोड़ने की है, लेकिन मैं लेआउट यह के अंत में हुआ है करने के लिए गारंटी है अगर पता नहीं है (कुछ लोगों का कहना है यदि ऐसा नहीं होता है, लेकिन फिर even Groupon + Google do it wrong)।

एक नक्शा टुकड़ा के लिए: प्रलेखन कहते हैं

MapFragment.getView().post(new Runnable(){ 
    run() { 
     ...Use the layout params... 
    } 
} 
+1

यह प्रश्न पूछा करने के लिए एक एक जवाब नहीं है। –

+0

मैं कभी-कभी इस सवाल पर वापस आ जाता हूं और सोचता हूं, ग्लेन बेच ने क्यों कहा कि यह सवाल पूछने का जवाब नहीं था, जबकि मैं इसे पूछने वाला हूं ** और ** ने इसका उत्तर दिया। – Maarten

+0

@GlennBech सही है, यह उत्तर नवीनतम मैप्स एपीआई के साथ काम नहीं करता है। यह सुनिश्चित नहीं है कि 'रननेबल' निष्पादित होने पर लेआउट समाप्त हो जाएगा। – gipi

2

मुझे लगता है कि यूआई प्रदर्शित होने के बाद आपको कुछ करना है।

वैश्विक लेआउट श्रोता का उपयोग करना हमेशा मेरे लिए अच्छा काम करता रहा है। लेआउट बदलने पर चीजों को फिर से निकालने में सक्षम होने का लाभ भी है, उदाहरण के लिए अगर कुछ देखने के लिए सेट है। GONE या बच्चे के विचार जोड़े/हटा दिए गए हैं।

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is 
    LinearLayout mainLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.main, null); 

    // set a global layout listener which will be called when the layout pass is completed and the view is drawn 
    mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       // at this point, the UI is fully displayed 
      } 
    } 
); 

setContentView(mainLayout); 

http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html

1

मैं onWindowFocusChanged(boolean) का प्रयोग करेंगे। बस की जाँच करता है, तो गतिविधि की खिड़की सिर्फ ध्यान केंद्रित हो गया

@Override 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
    super.onWindowFocusChanged(hasFocus); 

    if(hasFocus) 
    { 
     // Ask for any view size here 
    } 
} 
16

के रूप में, आप इस

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
        this.getResources().getDisplayMetrics().widthPixels, 
        this.getResources().getDisplayMetrics().heightPixels, 
        50)); 

का उपयोग करना चाहिए जहां इस एक गतिविधि

mapa.moveCamera(CameraUpdateFactory.newLatLngBounds(Builder.build(), 
        50)); 

यह मेरे लिए काम करता है, इसके बजाय ।

प्रलेखन

Note: Only use the simpler method newLatLngBounds(boundary, padding) to generate a CameraUpdate if it is going to be used to move the camera after the map has undergone layout. During layout, the API calculates the display boundaries of the map which are needed to correctly project the bounding box. In comparison, you can use the CameraUpdate returned by the more complex method newLatLngBounds(boundary, width, height, padding) at any time, even before the map has undergone layout, because the API calculates the display boundaries from the arguments that you pass.

+0

मुझे अभी भी आपके उल्लिखित कोड का उपयोग करके समस्या मिलती है। मैं 'फ्रैगमेंट एक्टिविटी' में कॉल का उपयोग कर रहा हूं। मुझे अपने कोड को दोबारा करने की आवश्यकता हो सकती है ताकि मैं सुनिश्चित कर सकूं कि इसे लेआउट सही तरीके से शुरू करने के बाद कहा जाता है। – theblang

+0

मेरी समस्या यह थी कि मैं 'ऑनकनेक्टेड 'में' moveCamera' का उपयोग करने की कोशिश कर रहा था, जिसे 'ऑनर्यूसम', 'locationClient.connect()' में कॉल किया गया था। नमूने में आधिकारिक 'MyLocationDemoActivity' के मुताबिक, वे' कनेक्ट किए गए 'में' अनुरोधस्थान अपडेट 'का अनुरोध करते हैं, फिर मैं 'moveCamera'' को 'लोकेशन चेंज' में उपयोग करता हूं। इसके साथ एक मामूली समस्या यह है कि एक संक्षिप्त क्षण होता है जब मानचित्र अपडेट होने से पहले कहीं और होता है। – theblang

+1

@ फ्रांसिस्को हर्नान्डेज़ मुझे यह समाधान पसंद है। अच्छी तरह से काम करता है खासकर जब आप बैकस्टैक पॉप करते हैं और मानचित्र को फिर से शुरू करना होता है – Alan

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

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