2010-06-27 11 views
5

Mam MapActivity. Jeśli jest ustawiona na odpowiednią lokalizację i poziom powiększenia, aby zobaczyć, że ruch nie jest pokazywany po pierwszym utworzeniu, dopóki nie wejdziesz w interakcję z mapą (kliknij na nią, przeciągnij, itp.), W którym punkt pojawi się ruch. Naturalnie chcę, aby ruch pojawiał się bez interakcji użytkownika po załadowaniu, ale nie byłem w stanie dowiedzieć się, jak go uruchomić. Jakieś pomysły?Android 1.6 Mapview nie wyświetla ruchu, dopóki użytkownik nie wejdzie w interakcje z mapą.

Z mojego MapActivity dziedziczonej klasy:

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

A oto co jest w 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> 

Odpowiedz

3

postInvalidate() po odpowiednim opóźnieniem powinien zrobić jako obejście, jakie czasami opóźnienia próbowałeś?

+0

Zgodnie z Twoją sugestią podałem tę kolejną próbę. Umieściłem mapView.postInvalidateDelayed (5000); w OnStart() dla tego działania i obejrzał, jak trafia w tryb debugowania, a następnie siedział i czekał, aż ruch wyświetli się na dobre 30 sekund. Wydaje się, że nie ma żadnego efektu. – Brian

+0

Właściwie masz rację. postInvalidate po opóźnieniu rzeczywiście działa, jeśli uruchomi się po całkowitym wyrenderowaniu mapy. Jeśli zostanie uruchomiony przed zakończeniem renderowania, nic się nie dzieje. smętne Test fix właśnie zrobił, która działa od onCreate od postInvalidateDelayed nie wydaje się, aby załatwić sprawę (bo odpaliłem go z wątku UI może?) I tak jakby brzydka to działa jeśli mapa renderuje w <1000ms: Timer timer = new Timer(); timer.schedule (nowa funkcja TimerTask() { @Override public void run() {mapView.postInvalidate();} }, 1000); – Brian

0

Próbowałem znaleźć XML attrs o MapView, ale nie mogłem ich znaleźć.

Domyślam się, że mapa nie jest odświeżana po użyciu setTraffic(true);

Spróbuj zadzwonić mapView.invalidate();

+0

Niestety, już próbowałem mapView.invalidate(); i mapView.postInvalidate() z opóźnieniem, ale wydaje się, że nie ma żadnego efektu. – Brian

0

Złożyłem zgłoszenie błędu na ten temat, numer 10317. Z moich badań wynika, że ​​po włączeniu trybu ruchu lub widoku ulicy w MapView rozpoczyna się wątek w celu pobrania danych z serwerów Google. Jeśli dane nie powrócą do czasu, w którym MapView sam się rysuje, wówczas odpowiednie linie nie zostaną wyświetlone. Interakcja użytkownika powoduje odświeżenie i dane są zwykle obecne. Wywołanie invalidate nie działa, ponieważ wątek nie zaczyna się, dopóki twój kod nie zostanie zakończony (tj. Kod, który ustawił tryb na). Rozwiązaniem jest opublikowanie przyszłego komunikatu, aby unieważnić MapView, powodując przerysowanie wtedy, gdy (mam nadzieję) dane są obecne. Poprawka dotyczy wątku, który pobiera dane, aby spowodować odświeżenie po pobraniu danych.

Powiązane problemy