Android googlemaps v2 завершает загрузку события или обратного вызова

Я хочу что-то сделать после загрузки карт Google (карты были заполнены), есть ли способ добиться этого?


person nairdat    schedule 19.01.2013    source источник
comment
Меня это тоже интересует. Ничего в документации API AFAIK не обслуживает. В MarkerDemoActivity.java из SDK есть что-то около строки 198, где mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ... ) } }); используется для проверки того, имеет ли карта размер. Я пробовал играть с этим и не добился успеха.   -  person qubz    schedule 20.01.2013


Ответы (1)


Как отмечает qubz, ViewTreeObserver можно использовать для выполнения обратного вызова после завершения загрузки карты, поэтому пользователь получит, например. правильное расположение сразу после запуска:

@Override
public void onCreate(Bundle savedInstanceState) {
    // This is a small hack to enable a onMapLoadingCompleted-functionality to the user.
    final View mapView = getSupportFragmentManager().findFragmentById(R.id.google_map_fragment).getView();
    if (mapView.getViewTreeObserver().isAlive()) {
        mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @SuppressWarnings("deprecation")
            // We use the new method when supported
            @SuppressLint("NewApi")
            // We check which build version we are using.
            @Override
            public void onGlobalLayout() {
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                    mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                } else {
                    mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
                // Send notification that map-loading has completed.
                onMapFinishedLoading();
            }
        });
    }
}

protected void onMapFinishedLoading() {
    // Do whatever you want to do. Map has completed loading at this point.
    Log.i(TAG, "Map finished loading.");
    GoogleMap mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.google_map_fragment))
                    .getMap();
    mMap.moveCamera(CameraUpdateFactory.zoomIn());
} 
person Alexander Pacha    schedule 10.06.2013
comment
К сожалению, это не всегда возвращает загруженную карту, а только видимый и измеренный вид. В настоящее время я не нашел никакого способа, но публикую отложенный Runnable с задержкой x-миллисекунд. - person joecks; 13.08.2013
comment
Первый: Чего вы хотите добиться? Например, если вы хотите приблизиться к определенной начальной позиции, этот метод finishLoading() будет работать нормально. Загрузка плиток будет асинхронной в фоновом режиме все время, когда пользователь прокручивает страницу, поэтому насколько значимым будет обратный вызов, если определенная часть полностью загружена? Кстати: выполнение задержки чрезвычайно опасно, потому что либо вы слишком долго блокируете своего пользователя (приложение не отвечает), либо вы слишком короткие, и данные не будут загружены готовыми. Поскольку это будет зависеть от скорости соединения для передачи данных, это явно недопустимо! - person Alexander Pacha; 14.08.2013
comment
Иногда getViewTreeObserver не активен в слушателе, даже если жив до addOnGlobalLayoutListener. - person xpto; 25.10.2013