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

私はこれとまったく同じ問題を経験しましたが、上記の解決策は機能します。しかし、私はそこにいるすべての初心者のために、より明確な実装を提示したいと思います。

マップのビュー変数を定義します。privateMapViewmapView;

そして、マップビューを割り当てます。

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

getLatitudeSpanを呼び出す前に、onCreate/onResumeで次を追加します。

mapView.postDelayed(waitForMapTimeTask, TIME_TO_WAIT_IN_MS);

そして、あなたは行ってもいいです:)

于 2011-11-17T08:24:52.773 に答える
3

状態を検出し、数百ミリ秒後に再試行するように作業をスケジュールします。AFAIK、これらの値は最終的に利用可能になりますが、タイミングに依存する可能性があります。理論的には、中心を設定してズームを設定した後に計算する必要がありますが、実際には、MapViewがレンダリングされるまで、おそらくインターネットからいくつかの地図データがダウンロードされるまで計算されないのではないかと思います。

したがって、これらのスパンに依存するコードをメソッドに分離します。おそらく今日行っているように、onCreate()からそのメソッドを呼び出します。AsyncTaskただし、検出ロジックを追加して無効な値を見つけ、値が無効な場合は、postDelayed()MapViewまたは他のView)を呼び出して、数百ミリ秒後にメソッドを再度呼び出します。postDelayed()また、このようなことを無期限に行わないように、ある種のカウンターを追加する必要があるかもしれません。

もちろん、これはハックです。しかし、Googleマップコンポーネントがオープンソースではないため、より堅実なものを思い付くのは困難です。

于 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 に答える