6

有时,当尝试使用 getLatitudeSpan() 和 getLongitudeSpan() 获取地图视图的纬度跨度或经度跨度时,我分别得到 0 和 360*1E6。这并不总是发生,但这是一个问题,有人遇到过这个问题吗?任何解决方法?我也尝试使用 getProjection() 但我遇到了同样的问题。这是一段代码:

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

4 回答 4

8

我已经解决了这个完全相同的问题,并且上述解决方案有效。但是,我想为所有初学者提供一个更清晰的实现。

为你的地图定义一个视图变量:private MapView mapView;

并分配地图视图:

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

添加以下方法:

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

在您的 onCreate/onResume 中,在调用 getLatitudeSpan 之前添加以下内容:

mapView.postDelayed(waitForMapTimeTask, TIME_TO_WAIT_IN_MS);

你很高兴:)

于 2011-11-17T08:24:52.773 回答
3

我会检测到这种情况并安排您的工作在几百毫秒后重试。AFAIK,这些值最终将变得可用,但它们可能相当依赖时间。从理论上讲,它们应该在您设置中心并设置缩放之后计算,但我怀疑它们直到MapView渲染之后才真正被计算,并且可能直到从互联网上下载一些地图数据。

因此,将依赖于这些跨度的代码隔离到一个方法中。onCreate()从和调用该方法AsyncTask,可能就像您今天所做的那样。但是,添加检测逻辑以查找无效值,然后如果值无效,则在几百毫秒后调用您的(或其他一些)再次调用您的postDelayed()方法MapViewView您可能还需要添加某种计数器,这样您就不会postDelayed()无限期地做这些事情。

当然,这是一个 hack。但是,由于谷歌地图组件不是开源的,因此很难想出更可靠的东西。

于 2010-04-19T13:49:51.087 回答
2

我一直在搞砸这个......并在选项卡式活动中拥有一个地图视图......直到onResume()才初始化这些值......我通过输入验证了这一点:

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

在不同的位置......在 onCreate() 和 onStart() 中它将无限期地运行(直到我切换到该选项卡),在 onResume() 中它会立即获得正确的值。

于 2010-12-25T00:38:21.903 回答
0

getLatitudeSpan 和 getLongitudeSpan 只能为您提供地图可见部分的跨度。因此,如果您在 onCreate() 中调用它们,地图将不会一直显示。改为在 onStart() 中调用它们,你应该没问题。

于 2010-10-07T00:46:49.870 回答