1

와 안드로이드에서 유지 조각에 사라하지 않았다. 이 작업을 통해 화면 방향을 변경할 수 있습니다.검색 GPS 아이콘이는 상황 MyLocationOverlay (osmdroid)

이러한 조각 중 하나에는 osmdroid 라이브러리로 생성 된 mapView가 있으며이 조각은 유지됩니다 (setRetainInstance (true)).

@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은 (getActivity(),지도보기) 새로운 MyLocationOverlay =;은"각 방향 변경에 이벤트 onCreateView 다시 해고 다시 실행하면 응용 프로그램을 닫으면 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(); 
} 

시 엉 엘 evento onCreateView hago 에스테 sencillo 엘 problema의 desaparece 제어 :

나는 onCreateView 이벤트에서이 컨트롤을 넣을 경우 문제를

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

을하지만, 무엇보다도, 난 더 이상 중앙 수 없습니다입니다 : 사라

mapController.animateTo(mLocationOverlay.getMyLocation()); 

어떤 아이디어가 있습니까? 내가 뭘 잘못하고있어?

더 많은 코드가 필요하면 더 이상 말할 필요가 없습니다. 고맙습니다! 여기

답변

0

두 가지 :

1) 코드의 나의 이해는 mLocationOverlay이 재현되는 때 방향 변경,하지만, 그 이전 인스턴스를 전환 활성화와 GPS에 연결을 유지하기 위해 LocationListener을 선도하지 않고.

대신 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의 이전 인스턴스를 참조합니다.

모두 작동합니까? 주저하지 말고, 필요한 경우 내 대답을 편집 할 것입니다.