我有一个带有碎片的导航抽屉。当应用程序启动时,谷歌地图视图上的标记出现在屏幕上。这是一个片段。
问题1 当点击另一个片段并返回到地图片段时,它将发出一个新的请求来显示地图。当使用replace().commit();
在片段上使用show()和hide()时,它正是我所需要的(直到旋转屏幕)。和它会变得有点复杂,当有超过2个片段在导航抽屉与所有检查isadd()显示和隐藏什么等等。是否有一种方法可以保留谷歌地图视图,而无需使用replace().commit()进行新的请求;
?问题2 同样的情况,当旋转屏幕时,谷歌地图碎片发出新的请求。在不同的activity
之间移动也会发生同样的事情因为Google Maps请求是有限的,所以这样浪费它们是没有意义的。
我只需要在应用程序开始时一个请求,然后在应用程序导航时显示相同的状态。
是MapFragment文件
public class MapFragment extends android.support.v4.app.Fragment implements OnMapReadyCallback {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_map, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap map) {
map.setMyLocationEnabled(true);
LatLng location= new LatLng(58.6536852, 25.481182);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 7));
map.addMarker(new MarkerOptions().position(new LatLng(59.408109, 24.326428)).title("marker 1"));
map.addMarker(new MarkerOptions().position(new LatLng(59.481070, 25.654483)).title("marker 2"));
}
}
这个问题的简单解决方案是在创建映射片段后调用setRetainInstance(true)。
此方法执行以下功能:
- 改变方向后保持标记。
- 避免在屏幕旋转后创建新的Map Fragment实例。
- 避免在每次创建时间地图后进行额外的请求。
下面是代码片段的概述:
public class RetainMapFragment extends MapFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
}