Просмотр карт getLatitudeSpan и getLongitudeSpan не работает - PullRequest
6 голосов
/ 19 апреля 2010

Иногда при попытке получить диапазон широты или долготы карты с помощью 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 ]

8 голосов
/ 17 ноября 2011

Я прошел через ту же самую проблему, и решения, указанные выше, работают.Однако я хотел бы представить более четкую реализацию для всех начинающих.

Определите переменную вида для вашей карты: частный 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);

И вы готовы идти:)

3 голосов
/ 19 апреля 2010

Я бы обнаружил состояние и запланировал бы вашу попытку повторить попытку через несколько сотен миллисекунд. AFAIK, эти значения в конечном итоге станут доступными, но они могут зависеть от времени. Теоретически, их следует вычислять после того, как вы установили центр и задали масштаб, но я подозреваю, что они действительно не рассчитываются до тех пор, пока не будет отображено MapView, и, возможно, не до тех пор, пока не будут загружены некоторые картографические данные из Интернета .

Итак, выделите ваш код, который зависит от этих диапазонов, в метод. Вызовите этот метод из onCreate() и AsyncTask, вероятно, как вы делаете сегодня. Но добавьте логику обнаружения, чтобы найти недопустимые значения, затем вызовите postDelayed() на вашем MapView (или другом * View), чтобы через несколько сотен миллисекунд снова вызвать ваш метод, если значения недопустимы. Вам также может понадобиться добавить какой-то счетчик, чтобы вы не делали это postDelayed() бесконечно долго.

Это, конечно, взлом. Но из-за того, что компонент Google Maps не является открытым исходным кодом, трудно придумать что-то более основательное.

2 голосов
/ 25 декабря 2010

Я бездельничал с этим ... и имел вид карты в действии с вкладками ... значения не инициализируются до 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 () он сразу получит правильные значения.

0 голосов
/ 07 октября 2010

getLatitudeSpan и getLongitudeSpan работают только для того, чтобы дать вам отрезки для видимой части карты. Поэтому, если вы вызываете их в onCreate (), карта не всегда будет отображаться. Вместо этого вызовите их в onStart (), и все будет в порядке.

...