2010-04-19 4 views
6

कभी-कभी getLatitudeSpan() और getLongitudeSpan() के साथ अक्षांश अवधि या अक्षांश दृष्टिकोण को प्राप्त करने का प्रयास करते समय मुझे क्रमश: 0 और 360 * 1E6 मिलता है। यह हमेशा नहीं होता है लेकिन यह एक समस्या है, क्या किसी को यह समस्या मिली है? कोई कामकाज? मैंने getProjection() का उपयोग करने की भी कोशिश की लेकिन मुझे एक ही समस्या मिल गई। यहां कोड का टुकड़ा है:मैपव्यू getLatitudeSpan और getLongitudeSpan काम नहीं कर रहा है

MapView mapView = (MapView) findViewById(R.id.mapview); 
int lat = mapView.getLatitudeSpan(); // sometimes returns 0 
int long = mapView.getLongitudeSpan(); // sometimes returns 360*1E6 
+0

आप इस कोड को कब निष्पादित कर रहे हैं? जब तक आप केंद्र बिंदु और ज़ूम स्तर सेट नहीं करते हैं और स्क्रीन पर मानचित्र प्रस्तुत किया जाता है, तब तक आपके पास अक्षांश या देशांतर अवधि नहीं होगी। – CommonsWare

+0

मैंने इस कोड को ऑन्रेट में और एक AsyncTask के अंदर प्रयोग किया जो मैं कुछ डेटा डाउनलोड करने के लिए उपयोग करता हूं। मैंने ज़ूम स्तर और केंद्र को ऑन्रेट पर सेट किया है।मैंने देखा है कि पहली बार जब मैं अपना ऐप चलाता हूं, तब मैं ऐसा करता हूं, जब मैं वापस उपयोग करता हूं और फिर गतिविधि में जाता हूं तो मैं आमतौर पर इस समस्या में भाग नहीं लेता। –

उत्तर

3

मैं शर्त का पता लगाऊंगा और कुछ सौ मिलीसेकंड के बाद फिर से प्रयास करने के लिए अपना काम शेड्यूल करूँगा। AFAIK, वे मूल्य अंततः उपलब्ध हो जाएंगे, लेकिन वे समय-निर्भर हो सकते हैं। सिद्धांत रूप में, आपके पास केंद्र सेट करने और ज़ूम सेट करने के बाद उनकी गणना की जानी चाहिए, लेकिन मुझे संदेह है कि MapView के बाद तक उन्हें वास्तव में गणना नहीं की जा रही है, और संभवतः जब तक इंटरनेट से कुछ मानचित्र डेटा डाउनलोड नहीं किया जाता है।

तो, अपने कोड को अलग करें जो एक विधि में उन स्पैन पर निर्भर करता है। उस विधि को onCreate() और AsyncTask से कॉल करें, संभवतया आप आज कर रहे हैं। लेकिन, अमान्य मानों को ढूंढने के लिए पहचान तर्क जोड़ें, फिर (या कुछ अन्य View) पर postDelayed() पर कॉल करें, यदि मान अमान्य हैं तो कुछ सौ मिलीसेकंड के बाद फिर से अपनी विधि का आह्वान करें। आपको किसी प्रकार का काउंटर जोड़ने की भी आवश्यकता हो सकती है ताकि आप यह postDelayed() अनिश्चित काल तक नहीं कर सकें।

यह, ज़ाहिर है, एक हैक है। लेकिन, Google मानचित्र घटक के साथ ओपन सोर्स नहीं होने के कारण, कुछ और ठोस के साथ आना मुश्किल है।

+0

क्या नक्शादृश्य पहले लोड होने पर ऑनस्क्रीन निर्देशांक प्राप्त करने का यह वास्तव में सबसे अच्छा समाधान है? ऐसा हैक की तरह लगता है ... क्या वास्तव में कोई कॉलबैक नहीं है? – edthethird

+0

@edthethird: चूंकि मानचित्र V1 अब बहिष्कृत है, आपको मानचित्र V2 को देखना चाहिए। – CommonsWare

+0

हम्म मैं हूं, लेकिन मुझे अभी भी एक ही समस्या है - onResume() में .getProjection() को कॉल करने का प्रयास कर रहा है और यह खाली है .. कॉलबैक आदर्श रूप से खोज रहा है लेकिन एसिंक कार्य – edthethird

0

getLatitudeSpan और getLongitudeSpan केवल आपको मानचित्र के दृश्य भाग के लिए स्पैन देने के लिए काम करता है। तो अगर आप उन्हें ऑन्रेट() पर कॉल करते हैं तो मानचित्र हमेशा प्रदर्शित नहीं होता है। उन्हें बजाय स्टार्ट() में कॉल करें और आपको ठीक होना चाहिए।

+1

के साथ प्रतीक्षा कर रहा है यह या तो काम नहीं करता है। 'getLongitudeSpan' अभी भी 'ऑनस्टार्ट' के बाद' 360 * 1E6' लौटाता है – skaffman

2

मैं इस के साथ चारों ओर खिलवाड़ किया गया है ... और एक टैब किए गतिविधि में एक MapView होने ... मूल्यों onResume() जब तक आरंभ नहीं कर रहे हैं ... मैं रख कर इस सत्यापित:

 final Handler mHandler = new Handler(); 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       latSpan = mapView.getLatitudeSpan(); 
       lngSpan = mapView.getLongitudeSpan(); 
       if ((latSpan == 0) && (lngSpan == 360000000)) { 
        count++; 
        System.out.println("here we go again! " + count); 
        mHandler.postDelayed(this, 100); 
       }  
      } 
     }, 100); 

विभिन्न स्थानों में ... ऑनक्रेट() और ऑनस्टार्ट() में यह अनिश्चित काल तक चलेगा (जब तक कि मैं उस टैब पर स्विच नहीं करता), रेज़्यूम() में यह तुरंत सही मान प्राप्त करता है।

8

मैं इस सटीक समस्या और कार्यों के ऊपर बताए गए समाधानों से गुजर चुका हूं। हालांकि मैं वहां सभी शुरुआती लोगों के लिए एक और स्पष्ट कार्यान्वयन प्रस्तुत करना चाहता हूं।

अपने मानचित्र के लिए व्यू वैरिएबल परिभाषित करें: निजी मानचित्र दृश्य मानचित्र देखें;

और MapView आवंटित:

mapView = (MapView) findViewById(R.id.mapview); 

निम्नलिखित विधि जोड़ें:

/** 
    * Wait for mapview to become ready. 
    */ 
    private Runnable waitForMapTimeTask = new Runnable() { 
     public void run() { 
      // If either is true we must wait. 
      if(mapView.getLatitudeSpan() == 0 || mapView.getLongitudeSpan() == 360000000) 
       mapView.postDelayed(this, TIME_TO_WAIT_IN_MS); 
     } 
    }; 

अपने onCreate/onResume में जोड़ने के निम्नलिखित पहले बुला लिए getLatitudeSpan:

mapView.postDelayed(waitForMapTimeTask, TIME_TO_WAIT_IN_MS); 

और तुम जाने के लिए अच्छे हैं :)

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