Задать вопрос

Как переиспользовать Google MapFragment?

Есть MainActivity c NavigationDrawer. Один из фрагментов включает в себя фрагмент с картой (SupportMapFragment). При переключении между ними хочется, чтобы карта не создавалась заново. Для этого использовался вот такой не самый красивый, но работающий код с переиспользованием view:

public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        return view;
    }
    view = inflater.inflate(R.layout.fragment_map, container, false);

    SupportMapFragment mapFragment = SupportMapFragment.newInstance();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.container, mapFragment).commit();

    mapFragment.getMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            map = googleMap;
            setupMap();
        }
    });

    return view;
}


В последней версии Play Services (6.5.87) и Support Library (21.0.3) такая возможность пропала. При повторном открытии фрагмента карта не отображается. Все другие элементы отображаются, а карта пустая.

Я могу по-нормальному все время делать "inflate view", но на карте тысячи маркеров (кластеризуются через maps-extensions) и их перерисовка занимает заметное время.

Есть какой-нибудь способ не пересоздавать карту?
  • Вопрос задан
  • 2931 просмотр
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pengrad Автор вопроса
Вместо MapFragment можно использовать MapView.

private MapView mapView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_map, container, false);
    
    boolean needSetupMap = true;
    if (mapView != null) {        
        ViewGroup parentViewGroup = (ViewGroup) mapView.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeView(mapView);
            needSetupMap = false;
        }
    } else {
        mapView = new MapView(getActivity());
        mapView.onCreate(Bundle.EMPTY);
    }  
    
    ((ViewGroup)view.findViewById(R.id.container)).addView(mapView);

    if (needSetupMap) {
        mapView.getExtendedMapAsync(new OnMapReadyCallback() {
            public void onMapReady(GoogleMap googleMap) {
                setUpMap(GoogleMap);
            }
        });
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы