【问题标题】:Zoom in to markers google map V2放大到标记谷歌地图 V2
【发布时间】:2014-07-20 15:48:21
【问题描述】:

我有一个具有 lat 和 long 属性的自定义对象的 ArrayList

我已经设法在地图上放置了标记。我想要的是能够在地图加载时放大这些标记。

我在下面的尝试导致应用崩溃。

这是加载地图的代码:

public void getBridgeData() {
    db = new DbHelperClass(this);
    bridges = db.getAllBridges();
    DecimalFormat dc = new DecimalFormat("#.000");
    Builder builder = new LatLngBounds.Builder();

    for (int i= 0;i<bridges.size();i++) {
        Bridge b= (Bridge)bridges.get(i);
        double lati= b.getLatitude();
        double longo= b.getLongitude();
        double reflat= b.getReflat();
        double reflong= b.getReflong();
        LatLng start = new LatLng(reflat,reflong);
        LatLng end = new LatLng(lati,longo);
        GeneralUtils uts = new GeneralUtils();
        double ch= uts.calculateDistance(start, end);
        String chainage = dc.format(ch);
        String mysnipet = "Location:" + b.getRoadname() + " " + chainage;
        Marker mm=map.addMarker(new 
            MarkerOptions().position(new LatLng(lati, longo))
                .title(b.getBridgename())
                .snippet(mysnipet));
                builder.include(mm.getPosition());
    }

    LatLngBounds bounds= builder.build();    
    map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 15));
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
}

这里也是部分代码

public class MainActivity extends FragmentActivity {
    private GoogleMap map;
    private DbHelperClass db;
    private List<Bridge> bridges = new ArrayList<Bridge>();
    CameraUpdate cu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_map);
        //AddSomeData();
        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
        .getMap();

        if(map!=null) {
            getBridgeData();
        }
    }
}

这是错误日志:

05-30 22:19:28.894: E/AndroidRuntime(5593): FATAL EXCEPTION: main
05-30 22:19:28.894: E/AndroidRuntime(5593): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bridge.bridgeinventory/com.bridge.bridgeinventory.MainActivity}: 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.
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1755)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1774)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread.access$1500(ActivityThread.java:157)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1001)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.os.Handler.dispatchMessage(Handler.java:130)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.os.Looper.loop(SourceFile:351)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread.main(ActivityThread.java:3841)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at java.lang.reflect.Method.invokeNative(Native Method)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at java.lang.reflect.Method.invoke(Method.java:538)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:969)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:727)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at dalvik.system.NativeStart.main(Native Method)
05-30 22:19:28.894: E/AndroidRuntime(5593): Caused by: 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.
05-30 22:19:28.894: E/AndroidRuntime(5593):     at kbh.b(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at mas.a(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at mal.a(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at mbi.a(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at fms.onTransact(SourceFile:83)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.os.Binder.transact(Binder.java:310)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.bridge.bridgeinventory.MainActivity.getBridgeData(MainActivity.java:148)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at com.bridge.bridgeinventory.MainActivity.onCreate(MainActivity.java:44)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
05-30 22:19:28.894: E/AndroidRuntime(5593):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1719)
05-30 22:19:28.894: E/AndroidRuntime(5593):     ... 11 more

我怎样才能让它工作?

【问题讨论】:

  • 感谢您提出这个问题 :)

标签: java android google-maps


【解决方案1】:

问题是地图尚未加载到布局中,这就是您收到该错误的原因

解决方案:

 map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
    @Override
    public void onMapLoaded() {
        map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 15));
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    }
});

当地图已经加载到布局中时,它会调用该方法。

【讨论】:

  • @user3079559 不客气.. 也支持它以供将来参考
  • 遇到了同样的问题,真是巧合!
  • 非常罕见的问题和非常有用的答案。
  • 这太棒了,我什至不知道这个回调存在。而我的旧解决方法是使用非常不一致的 addOnGlobalLayoutListener!
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2016-10-12
相关资源
最近更新 更多