2010-04-19 61 views
6

有時當試圖通過getLatitudeSpan()和getLongitudeSpan()獲得mapview的緯度跨度或經度跨度時,我分別得到0和360 * 1E6。這並不總是發生,但這是一個問題,有沒有人得到這個問題?任何解決方法?我也嘗試使用getProjection(),但我得到同樣的問題。這是一段代碼:Mapview 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 2010-04-19 13:14:11

+0

我在onCreate中嘗試了這段代碼,並在一個AsyncTask中用於下載一些數據。我設置了縮放級別並以onCreate爲中心。我注意到,在我第一次運行我的應用程序時,大部分時間發生這種情況,當我使用回來並重新開始活動時,通常不會遇到此問題。 – 2010-04-19 13:41:50

回答

3

我會檢測到這種情況並安排您的工作在幾百毫秒後再次嘗試。 AFAIK,這些值最終會變得可用,但它們可能相當時間依賴。從理論上講,應該在設置中心並設置縮放後計算它們,但是我懷疑它們確實在MapView被渲染之後才被計算出來,並且可能直到下載了來自Internet的一些地圖數據。

因此,將取決於這些跨度的代碼隔離到一個方法中。可能從今天開始,從onCreate()AsyncTask調用該方法。但是,添加檢測邏輯來查找無效值,然後在MapView(或其他一些View)上調用postDelayed(),以便在數百毫秒後再次調用您的方法(如果這些值無效)。您可能還需要添加某種計數器,因此您不會無限期地執行此操作。

這當然是黑客。但是,由於Google地圖組件不是開源的,因此很難想出更堅實的東西。

+0

這真的是在mapview首次加載時獲得屏幕座標的最佳解決方案嗎?看起來像這樣的黑客...真的沒有回調? – edthethird 2013-04-25 19:25:29

+0

@edthethird:由於Maps V1現在已被棄用,因此您應該查看Maps V2。 – CommonsWare 2013-04-25 19:27:22

+0

嗯我是,但我仍然有同樣的問題 - 試圖調用onResume()中的.getProjection(),它是空的..理想尋找回調,但最終等待與異步任務 – edthethird 2013-04-25 21:08:10

0

getLatitudeSpan和getLongitudeSpan只能爲您提供地圖可見部分的跨度。因此,如果您在onCreate()中調用它們,則地圖不會始終顯示。用onStart()調用它們,你應該沒問題。

+1

這也不起作用。 'onLongitudeSpan'仍然在'onStart'後返回'360 * 1E6' – skaffman 2010-11-17 11:35:36

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); 

在onCreate()和onStart()中的各個位置...它將無限期地(直到我切換到該選項卡),在onResume()它立即得到正確的值。

8

我已經經歷了這個完全相同的問題,上述解決方案的工作。不過,我想爲所有初學者提供一個更清晰的實現。

爲你的地圖定義一個視圖變量: private MapView mapView;

並分配的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); 

你很好去:)