我在片段中使用了MapView:
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
根据文档,我得到了地图视图:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mapView = (MapView) view.findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
...
}
实现OnMapReadyCallback,因为我的地图准备就绪,我想注册一个客户监听器,它会为我的地图添加点数。
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
// setup custom listener
// this will call me back when there are points that
// need to be added/removed from the map
myPointService.registerListener(this);
...
}
我想在地图视图不在屏幕上时停止收听:
@Override
public void onPause() {
super.onPause();
mapView.onPause();
// stop listener
myPointService.unregisterListener(this);
}
问题在于,当调用onResume()时,我不再听了。
我可以在onResume()中重新注册,但我认为我无法确定地图是否可用。我也不想再注册两次,所以我需要检查地图是否可用而且我还没有收听。 IE在第一次初始化onCreateView()和onResume()时可能会在调用onMapReady之前调用。
我可以保留一个标志,指示我是否已经设置了我的监听器,如果已经设置了监听器,则检查onMapReady()和onResume(),如果没有,则设置它们,并更新标志,以便监听器不会多次设置。
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
// setup custom listener
// this will call me back when there are points that
// need to be added/removed from the map
if (!mListenersRegistered) {
myPointService.registerListener(this);
mListenersRegistered = true;
}
...
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
// There is a change on map ready already set this up
// so need to check before adding the listener.
// also need to make sure that the GoogleMap has been initialized
if (!mListenersRegistered && mMap != null) {
myPointService.registerListener(this);
mListenersRegistered = true;
}
}
最近设置地图已变为异步,因为发生了这种情况,我还没有看到任何关于如何处理这种情况的例子。