如何持久化谷歌地图API Android v2视图状态,而不做新的请求时,旋转屏幕或导航



我有一个带有碎片的导航抽屉。当应用程序启动时,谷歌地图视图上的标记出现在屏幕上。这是一个片段。

问题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);
 }
}

最新更新