如何在其他 Fragment 中重用 SupportMapFragment

How to reuse SupportMapFragment inside other Fragment

我刚刚切换到最新版本的 android-maps-extensions (2.2.0) 以及最新的 Play Services (6.5.87) 和支持库 (21.0.3)。 现在我不能重用我的 MapFragment。

我有 MainActivity 和 NavigationDrawer。其中一个片段是内含 GoogleMap 片段的片段。当我在 NavigationDrawer 中的片段之间切换时,它们会重新创建自己。以前我为此使用了非常简单的解决方案。我使用了已经膨胀的视图:

 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.getExtendedMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            map = googleMap;
            setupMap();
        }
    });

    return view;
}

但是现在不行了。此片段第二次打开时地图不显示。

我可以扔掉这个丑陋的代码

 if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        return view;
    }

并且始终在内部重新创建视图。但是我有成千上万的标记(当然还有很棒的聚类)并且需要很多时间来重新绘制它们。

我知道这不是扩展库的问题,Google 地图具有相同的行为。但也许你知道正确的决定?

我们可以使用 MapView,而不是使用 MapFragment,它也存在于 androidmapsextensions 中。并且可以重复使用。

由于以编程方式添加 MapView,需要调用 mapView.onCreate(bundle)

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

    if (mapView != null) {        
        ViewGroup parentViewGroup = (ViewGroup) mapView.getParent();
        if (parentViewGroup != null) {
            parentViewGroup.removeView(mapView);            
        }
    } else {
        mapView = new MapView(getActivity());
        mapView.onCreate(Bundle.EMPTY); //need if programmatically add 
    }    

    ((ViewGroup)view.findViewById(R.id.container)).addView(mapView);

    mapView.getExtendedMapAsync(new OnMapReadyCallback() {
        public void onMapReady(GoogleMap googleMap) {
            setUpMap(GoogleMap);
        }
    });    
}    

或者如果我们不需要为重复使用的 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);
            }
        });
    }
}