在片段里面的MapView生命周期

时间:2015-11-07 18:21:58

标签: android google-maps android-fragments android-mapview

我在片段中使用了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;
    }
}

最近设置地图已变为异步,因为发生了这种情况,我还没有看到任何关于如何处理这种情况的例子。

0 个答案:

没有答案