1

從未消失情況是這樣的:搜索GPS圖標上Android中保留片段與MyLocationOverlay(osmdroid)

我有一個活性用含有三個片段一個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 =新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(); 
} 

矽恩EL事件摘要onCreateView哈戈埃斯特sencillo控制EL problema desaparece:

如果我把在onCreateView事件這種控制,問題消失:

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

不過,除其他事項外,我不能再中心:

mapController.animateTo(mLocationOverlay.getMyLocation()); 

有什麼想法嗎?有什麼我做錯了?

如果你需要更多的代碼,你沒有更多的話要說。謝謝!這裏

回答

0

兩件事情:

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從另一個方向:當您的MapView重新初始化在onCreate()時,您的控制器也應該重新初始化。這可能是地圖不再移動的原因:控制器引用此MapView的前一個實例,而不是當前的實例。

是否所有這些工作?不要猶豫,讓我知道,如果需要,我會編輯我的答案。