【问题标题】:Searching GPS icon never disappears on retained Fragment in Android with MyLocationOverlay (osmdroid)使用 MyLocationOverlay(osmdroid)在 Android 中保留的 Fragment 上搜索 GPS 图标永远不会消失
【发布时间】:2014-07-21 15:09:52
【问题描述】:

情况是这样的:

我有一个包含三个片段的 PagerAdapter 活动。此活动允许您更改屏幕方向。

其中一个片段具有使用 osmdroid 库创建的 mapView,并且该片段被保留 (setRetainInstance(true))。在每次改变方向时,都会再次触发 onCreateView 事件:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    fragmentView = (LinearLayout) inflater.inflate(R.layout.main,
            container, false);

    mapView = (MapView) fragmentView.findViewById(R.id.practice_mapview);

    mapView.setBuiltInZoomControls(true);
    mapView.setMultiTouchControls(true);
    mapView.setTileSource(TileSourceFactory.MAPNIK);
    mapView.setUseSafeCanvas(true);
    setHardwareAccelerationOff();

    mapController = (MapController) mapView.getController();

    [...]

    mLocationOverlay = new MyLocationOverlay(getActivity(), mapView);
    mLocationOverlay.setDrawAccuracyEnabled(true);

    [...]

    mapView.invalidate();

    return fragmentView;
}

一开始一切正常,但是当我旋转手机时,语句“mLocationOverlay = new MyLocationOverlay(getActivity(), mapView);”再次执行,这意味着,当你关闭应用程序,GPS 图标永远不会消失。

如果您不旋转手机,该图标会在应用程序关闭时消失。

这是我在 onPause 事件中的内容:

@Override
public void onPause() {
    mLocationOverlay.disableCompass();

    if (this.getActivity().isFinishing()) {
        disableMyLocation();    
        releaseLocationOverlay();
    }

    cleanMapViewCache();
}

private void disableMyLocation() {
    if (mLocationOverlay.isMyLocationEnabled() == true)
        mLocationOverlay.disableMyLocation();

    if (mLocationOverlay.isFollowLocationEnabled() == true)
        mLocationOverlay.disableFollowLocation();
}

private void releaseLocationOverlay() {
    if (mLocationOverlay != null) {
        mapView.getOverlays().remove(mLocationOverlay);
        mLocationOverlay = null;
    }
}

private void cleanMapViewCache() {
    mapView.getTileProvider().clearTileCache();
    System.gc();
}

Si en el eventto onCreateView hago este sencillo control el problema desaparece:

如果我把这个控件放在onCreateView事件中,问题就消失了:

if (this.getActivity().isFinishing())
    mLocationOverlay = new MyLocationOverlay(getActivity(), mapView);

但是,除此之外,我无法再居中了:

mapController.animateTo(mLocationOverlay.getMyLocation());

有什么想法吗?是不是我做错了什么?

如果您需要更多代码,则无需多说。谢谢!

【问题讨论】:

    标签: android fragment screen-orientation osmdroid mylocationoverlay


    【解决方案1】:

    这里有两件事:

    1) 我对您的代码的理解是,mLocationOverlay 会在方向改变时重新创建,但不会关闭其旧实例,从而导致LocationListener 保持活动状态并链接到 GPS。

    而不是在onCreate()中这样做:

    // this is a copypaste of your workaround code but that prevents the map from moving
    if (this.getActivity().isFinishing())
        mLocationOverlay = new MyLocationOverlay(getActivity(), mapView);
    

    尝试做:

    if (mLocationOverlay != null) {
        uninitialize(); // see below
        mLocationOverlay = new MyLocationOverlay(getActivity(), mapView);
     }
    

    然后,以这种方式更改您的onPause()

    public void onPause() {
        uninitialize();
    }
    

    并创建此方法:

    private void uninitialize() {
        // What follows is your former onPause() code:
        mLocationOverlay.disableCompass();
    
        if (this.getActivity().isFinishing()) {
            disableMyLocation();    
            releaseLocationOverlay();
        }
    
        cleanMapViewCache();
    }
    

    所有这些都需要优化/重构。例如,我不确定在更改设备方向时调用 cleanMapViewCache() 是否有用。

    2) 另外,非常重要的是,不要将您以前的mapController 从一个方向转移到另一个方向:当您的MapViewonCreate() 中重新初始化时,您的控制器也应该重新初始化。这可能是地图不再移动的原因:控制器引用此 MapView 的前一个实例而不是当前实例。

    所有这些都有效吗?不要犹豫让我知道,如果需要,我会编辑我的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多