2010-04-19 15 views
6

A veces, al intentar obtener el Latitude span o el Longitude span de una mapview con getLatitudeSpan() y getLongitudeSpan() obtengo 0 y 360 * 1E6 respectivamente. Esto no sucede siempre, pero es un problema. ¿Alguien ha tenido este problema? ¿Alguna solución? Intenté usar getProjection() también, pero tengo el mismo problema. Aquí está el trozo de código:Mapview getLatitudeSpan y getLongitudeSpan no funciona

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

¿Cuándo está ejecutando este código? No tendrá una extensión de latitud o longitud hasta que establezca un punto central y un nivel de zoom, y el mapa se muestre en la pantalla. – CommonsWare

+0

Probé este código en onCreate, y dentro de una AsyncTask que uso para descargar algunos datos. Ajusto el nivel de zoom y me centro en Crear.Me he dado cuenta de que esto sucede la mayor parte del tiempo la primera vez que ejecuto mi aplicación, después de que cuando uso de nuevo y vuelvo a la actividad, normalmente no me encuentro con este problema. –

Respuesta

3

Me detectar la condición y programar su trabajo para intentarlo de nuevo después de unos pocos cientos de milisegundos. AFAIK, esos valores eventualmente estarán disponibles, pero pueden ser más bien dependientes del tiempo. En teoría, deberían calcularse después de establecer el centro y establecer el zoom, pero sospecho que realmente no se están calculando hasta después de que se muestre el MapView, y posiblemente no hasta que se descarguen algunos datos del mapa de Internet.

Por lo tanto, aísle su código que depende de esos tramos en un método. Llame a ese método desde onCreate() y AsyncTask, probablemente como lo está haciendo hoy. Sin embargo, agregue lógica de detección para encontrar los valores no válidos, luego llame al postDelayed() en su MapView (u otro View) para invocar su método de nuevo después de unos cientos de milisegundos si los valores no son válidos. Es posible que también necesite agregar algún tipo de contador para no hacer esto postDelayed() indefinidamente.

Esto, por supuesto, es un truco. Pero, como el componente de Google Maps no es de código abierto, es difícil encontrar algo más sólido.

+0

¿Es esta la mejor solución para obtener coordenadas en pantalla cuando se carga por primera vez una vista de mapa? parece como un truco ... ¿Realmente no hay devolución de llamada? – edthethird

+0

@ thethethird: Dado que Maps V1 está ahora en desuso, debería estar mirando Maps V2. – CommonsWare

+0

hmm Lo estoy, pero todavía tengo el mismo problema-- tratando de llamar a .getProjection() en onResume() y está vacío. Buscando la devolución de llamadas idealmente pero terminé esperando con la tarea asincrónica – edthethird

0

getLatitudeSpan y getLongitudeSpan solo trabaja para darle los tramos de la parte visible del mapa. Por lo tanto, si los llamas en onCreate(), el mapa no siempre se habrá visualizado todavía. Llámalos en onStart() y deberías estar bien.

+1

Esto tampoco funciona. 'getLongitudeSpan' aún devuelve' 360 * 1E6' después de 'onStart' – skaffman

2

He estado jugando con esto ... y tener un MapView en una actividad con pestañas ... los valores no se inicializan hasta onResume() ... He verificado esto poniendo:

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

En Varias ubicaciones ... en onCreate() y onStart() irá indefinidamente (hasta que cambie a esa pestaña), en onResume() obtiene los valores correctos inmediatamente.

8

He pasado por este mismo problema y las soluciones indicadas anteriormente funcionan. Sin embargo, me gustaría presentar una implementación más clara para todos los principiantes.

Defina una variable de vista para su mapa: privado MapView mapView;

y asignar el MapView:

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

añade el siguiente método:

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

En su onCreate/onResume agregar lo siguiente antes de llamar getLatitudeSpan:

mapView.postDelayed(waitForMapTimeTask, TIME_TO_WAIT_IN_MS); 

Y usted son buenos para ir :)