2015-03-13 3 views
1

Большинство примеров, которые я могу найти в сети, используют теперь устаревший метод getMap(). Google говорит, что использует getMapAsync(). Я могу нарисовать маркеры на моей карте, но когда я включаю код границ, я получаю исключение IllegalStateException. Итак, мой вопрос, как правильно установить LatLngBounds.Builder?Границы настройки гаджета Googlemaps

код и LogCat следовать:

public class TripsMap extends FragmentActivity implements OnMapReadyCallback { 
MapView mMapView; 
private GoogleMap googleMap; 
GoogleMapOptions options = new GoogleMapOptions(); 
private LatLngBounds.Builder bounds; 

Trips trip; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.trips_map_fragment); 

    Bundle extras = getIntent().getExtras(); 
    trip = (Trips) extras.getSerializable("tripInfo"); 

    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    bounds = new LatLngBounds.Builder(); 

    int subTrips = trip.getSubtripsNum(); 

    for (int i=0; i<subTrips; i++) { 
     SubTrips st = trip.getSubTrips().get(i); 

     //major origin 
     googleMap.addMarker(new MarkerOptions() 
       .position(convertLatLng(st.originCoords)) 
       .title(st.origin)); 
     Log.i("MAJOR", st.origin); 

     //use .include to put add each point to be included in the bounds 
     bounds.include(convertLatLng(st.originCoords)); 


     int minor = st.intermediateStation.size(); 
     for (int j=0; j<minor; j++){ 
      IntermediateStops is = st.intermediateStation.get(j); 

      //minor stop 
      googleMap.addMarker(new MarkerOptions() 
        .position(convertLatLng(is.coords)) 
        .title(is.stationName)); 

     } 

     //major destination 
     googleMap.addMarker(new MarkerOptions() 
       .position(convertLatLng(st.destCoords)) 
       .title(st.destination)); 

     bounds.include(convertLatLng(st.destCoords)); 

    } 

    googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), 50)); 

} 

public LatLng convertLatLng(String s) { 
    String[] latlong = s.split(","); 
    double latitude = Double.parseDouble(latlong[0]); 
    double longitude = Double.parseDouble(latlong[1]); 
    LatLng ll = new LatLng(latitude, longitude); 
    return ll; 
} 

}

Logcat:

FATAL EXCEPTION: main 
java.lang.IllegalStateException: Error using newLatLngBounds(LatLngBounds, int): Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions. 
     at com.google.k.a.cj.b(Unknown Source) 
     at com.google.maps.api.android.lib6.gmm6.c.c.a(Unknown Source) 
     at com.google.maps.api.android.lib6.c.dp.a(Unknown Source) 
     at com.google.maps.api.android.lib6.gmm6.c.c.a(Unknown Source) 
     at com.google.maps.api.android.lib6.c.el.a(Unknown Source) 
     at com.google.android.gms.maps.internal.l.onTransact(SourceFile:83) 
     at android.os.Binder.transact(Binder.java:326) 
     at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source) 
     at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source) 
     at mtr.se.reskoll.TripsMap.onMapReady(TripsMap.java:87) 
     at com.google.android.gms.maps.MapFragment$a$1.a(Unknown Source) 
     at com.google.android.gms.maps.internal.m$a.onTransact(Unknown Source) 
     at android.os.Binder.transact(Binder.java:326) 
     at com.google.android.gms.maps.internal.ba.a(SourceFile:82) 
     at com.google.maps.api.android.lib6.c.er.run(Unknown Source) 
     at android.os.Handler.handleCallback(Handler.java:615) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4898) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
     at dalvik.system.NativeStart.main(Native Method) 

ответ

0

Используйте этот

SupportMapFragment mapFragment =(SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); 

вместо

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 

Проблема также может быть вызвана упомянутой причиной, указанной в документации документации here.

Не изменяйте камеру с этим обновлением камеры, пока карта не имеет макета (прошли необходимую для того, для этого метода, чтобы правильно определить уровень соответствующей ограничительной рамки и масштабирования, карта должна иметь размер). В противном случае будет выбрано исключение IllegalStateException. Это НЕ , достаточное для того, чтобы карта была доступна (т. Е. GetMap() возвращает ненулевой объект ); в представлении, содержащем карту, также должно было быть выполнено , чтобы его размеры были определены. Если вы не можете быть уверены, что это произошло, вместо этого используйте newLatLngBounds (LatLngBounds, int, int, int) и укажите размеры карты вручную.

+0

, когда у меня есть фрагмент с шириной и высотой, установленный в match_parent и wrap_content, как предполагается, что жесткий код в пикселях? – tomislav2012

Смежные вопросы