Видимая область проекции GoogleMap (Android) не обновляется после изменения ориентации?

Когда вызывается мой метод SupportMapFragment onCreateView(), я читаю карту

getProjection().getVisibleRegion().latLngBounds.northeast.x

и

getProjection().getVisibleRegion().latLngBounds.southwest.y

При первом запуске приложения (в портретном режиме) я получаю x=720 и y=1230. Однако после изменения ориентации на альбомную я снова вижу те же значения.

Возврат к портретному режиму дает x=1280 и y=670 (чего я и ожидал от альбомной ориентации), а возврат к альбомной ориентации снова дает первые числа.

Как будто проекция всегда отстает на одно изменение ориентации.

Любая идея, что не так, и как это исправить?


person elchar    schedule 02.07.2014    source источник


Ответы (1)


Проблема здесь в том, что onConfigurationChanged (где, как я предполагаю, вы проверяете значения x и y) вызывается прежде, чем GoogleMap сможет обновить свою проекцию.

Один из способов, который я нашел для этого, - запустить фиктивное масштабирование на 0%, которое вызовет onCameraIdle после его завершения (с обновленной проекцией).


Добавьте OnCameraIdleListener:

// add this to your imports
import com.google.android.gms.maps.GoogleMap.OnCameraIdleListener

// add this to your map-using activity
class MapsActivity implements ..., OnCameraIdleListener { ... }

Затем внутри вашей активности по использованию карты:

@Override
public void onCameraIdle() {
    // ... do something with getProjection() ...
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // dummy zoom to trigger onCameraIdle with *correct* orientation
    mMap.animateCamera( CameraUpdateFactory.zoomBy(0f) );
}
person xjcl    schedule 24.05.2020
comment
Я использую Kotlin и вручную перевел его на Java, поэтому не стесняйтесь исправлять, если он не работает =) - person xjcl; 25.05.2020