2010-04-19 9 views
6

Czasami, gdy próbuje się uzyskać szerokość geograficzną lub długość geograficzną widoku mapy za pomocą getLatitudeSpan() i getLongitudeSpan(), otrzymuję odpowiednio 0 i 360 * 1E6. Nie zdarza się to zawsze, ale jest problem, czy ktoś ma ten problem? Jakiekolwiek obejścia? Próbowałem również używać getProjection(), ale mam ten sam problem. Oto fragment kodu:Mapview getLatitudeSpan i getLongitudeSpan nie działają

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

Kiedy wykonujecie ten kod? Nie będziesz mieć zasięgu szerokości i długości geograficznej, dopóki nie ustawisz punktu środkowego i poziomu powiększenia, a mapa zostanie wyświetlona na ekranie. – CommonsWare

+0

Próbowałem tego kodu w onCreate i wewnątrz AsyncTask, którego używam do pobrania niektórych danych. Ustawiam poziom powiększenia i wyśrodkuję na Żądanie.Zauważyłem, że dzieje się tak przez większość czasu przy pierwszym uruchomieniu aplikacji, po tym jak ponownie skorzystam z tej funkcji i ponownie przejdę do tej czynności, zwykle nie napotykam tego problemu. –

Odpowiedz

3

Chciałbym wykryć stan i zaplanować pracę, aby spróbować ponownie po kilkuset milisekundach. AFAIK, te wartości staną się ostatecznie dostępne, ale mogą być zależne od czasu. Teoretycznie należy je obliczyć po ustawieniu środka i ustawieniu zoomu, ale podejrzewam, że tak naprawdę nie są one obliczane przed renderowaniem MapView i prawdopodobnie dopiero po pobraniu niektórych danych map z Internetu.

Wyizoluj w metodzie kod, który zależy od tych zakresów. Wywołaj tę metodę z onCreate() i AsyncTask, prawdopodobnie tak jak dzisiaj. Ale dodaj logikę wykrywania, aby znaleźć nieprawidłowe wartości, a następnie wywołaj postDelayed() na twoim MapView (lub innym View), aby wywołać twoją metodę ponownie po kilkuset milisekundach, jeśli wartości są nieprawidłowe. Być może będziesz musiał dodać jakiś licznik, więc nie będziesz robić tego w nieskończoność.

To oczywiście hack. Ale z komponentem Google Maps nie będącym open source, trudno jest wymyślić coś solidniejszego.

+0

jest to naprawdę najlepsze rozwiązanie do uzyskania współrzędnych na ekranie, gdy najpierw załaduje się widok mapy? wydaje się takim hack ... Czy naprawdę nie ma oddzwaniania? – edthethird

+0

@edthethird: Ponieważ Mapy V1 są teraz przestarzałe, powinieneś szukać w Mapach V2. – CommonsWare

+0

hmm Jestem, ale nadal mam ten sam problem - próba wywołania .getprojection() w onResume() i jest pusta. Poszukuje callback idealnie, ale skończyło się czekaniem z zadaniem asynchronicznym – edthethird

0

getLatitudeSpan i getLongitudeSpan działa tylko w celu uzyskania rozpiętości dla widocznej części mapy. Jeśli więc wywołasz je w trybie onCreate(), mapa nie zawsze będzie jeszcze wyświetlana. Zadzwoń do nich w onStart(), a powinieneś być w porządku.

+1

To też nie działa. 'getLongitudeSpan' nadal zwraca' 360 * 1E6' po 'onStart' – skaffman

2

I zostały aprowizacji z tym ... i posiadające MapView w kartach aktywności ... wartości nie są inicjowane aż onResume() ... I to zweryfikowane poprzez umieszczenie:

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

W różnych lokalizacjach ... w onCreate() i onStart() będzie działać przez czas nieokreślony (dopóki nie przełączyłem się na tę kartę), w onResume() natychmiast uzyska poprawne wartości.

8

Przeszedłem przez ten sam problem, a powyższe rozwiązania działają. Chciałbym jednak przedstawić bardziej przejrzystą implementację dla wszystkich początkujących.

Zdefiniuj zmienną widoku dla mapy: prywatna mapa MapViewView;

i przypisać MapView:

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

dodaj następującą metodę:

/** 
    * 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); 
     } 
    }; 

w twojej onCreate/onResume dodać następujące przed wywołaniem getLatitudeSpan:

mapView.postDelayed(waitForMapTimeTask, TIME_TO_WAIT_IN_MS); 

I są dobre do przejścia :)