gpt4 book ai didi

android-maps-v2 - 如何在其他 Fragment 中重用 SupportMapFragment

转载 作者:行者123 更新时间:2023-12-04 07:13:40 24 4
gpt4 key购买 nike

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

我有带 NavigationDrawer 的 MainActivity。其中一个片段是内部带有 GoogleMap 片段的片段。当我在 NavigationDrawer 中的片段之间切换时,它们会重新创建自己。以前我为此使用了非常简单的解决方案。我使用了已经膨胀的 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.getExtendedMapAsync(new OnMapReadyCallback() {
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
setupMap();
}
});

return view;
}

但现在它不起作用。 map 不显示此片段第二次打开的时间。

我可以扔掉这个丑陋的代码
 if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
return view;
}

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

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

最佳答案

我们可以使用 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);
}
});
}
}

关于android-maps-v2 - 如何在其他 Fragment 中重用 SupportMapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com