2010-06-27 7 views
5

Tengo una MapActivity. Si se establece en una ubicación y nivel de zoom apropiados para ver el tráfico, ninguno se muestra después de que se creó por primera vez hasta que interactúas con el mapa (haz clic en él, arrastra, etc.), en cuyo punto se muestra el tráfico. Naturalmente, quiero que el tráfico se muestre sin ninguna interacción del usuario después de que se cargue, pero no he podido averiguar cómo activarlo. ¿Algunas ideas?Android 1.6 Mapview no muestra el tráfico hasta que el usuario interactúe con el mapa

Desde mi clase heredada MapActivity:

private MapView mapView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.map); 
mapView = (MapView) findViewById(R.id.mapview); 
mapView.setBuiltInZoomControls(true); 
mapView.setTraffic(true); 
} 

Y aquí es cuál está en R.layout.map

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mainlayout" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <com.google.android.maps.MapView 
     android:id="@+id/mapview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:clickable="true" 
     android:apiKey="...MY API KEY HERE..." 
    /> 
</RelativeLayout> 

Respuesta

3

postInvalidate() después de un retardo adecuado debe hacer como una solución, ¿qué clase de tiempos de retardo ha intentado?

+0

En su sugerencia, le di otra oportunidad. Coloqué mapView.postInvalidateDelayed (5000); en OnStart() para esta actividad y lo vio golpearse en modo de depuración y luego se sentó y esperó a que apareciera el tráfico durante unos buenos 30 segundos. No pareció tener ningún efecto. – Brian

+0

En realidad, estás en lo cierto. postInvalidar después de un retraso sí funciona si se inicia después de que el mapa esté completamente renderizado. Si se dispara antes de que se complete la primera renderización, no pasa nada. Una revisión cheezy que acabo de hacer que funciona desde onCreate ya que postInvalidateDelayed no parece funcionar (¿porque lo disparé del subproceso ui?) De todos modos aunque feo esto funciona si el mapa representa en <1000ms: Temporizador de temporizador = nuevo temporizador(); timer.schedule (new TimerTask() { @Override public void run() {mapView.postInvalidate();} }, 1000); – Brian

0

He intentado encontrar la XML attrs del MapView pero no pude encontrarlos.

Mi conjetura es que el mapa no se vuelve a dibujar después de usar setTraffic(true);

Intente llamar mapView.invalidate();

+0

Lamentablemente, ya he intentado mapView.invalidate(); y mapView.postInvalidate() con un tiempo de retraso pero no parece tener ningún efecto. – Brian

0

He archivado un informe de error al respecto, número 10317. De mi investigación, cuando enciendes el tráfico o el modo streetview en un MapView, se inicia un hilo para recuperar los datos de los servidores de Google. Si los datos no están regresados ​​cuando MapView se dibuja, las líneas correspondientes no se muestran. La interacción del usuario causa un redibujado y para entonces los datos generalmente están presentes. La llamada invalidada no funciona porque el hilo no se inicia hasta que el código termina de ejecutarse (es decir, el código que activa el modo). La solución consiste en publicar un mensaje futuro para invalidar MapView causando un redibujado luego cuando (con suerte) los datos estén presentes. La solución sería para el subproceso que hace que la obtención de datos provoque un redibujado cuando se recuperaron los datos.

Cuestiones relacionadas