1

Это ситуация:Поиск значок GPS никогда не исчезает удерживаемый фрагмент в Android с MyLocationOverlay (osmdroid)

У меня есть деятельность с PagerAdapter, содержащей три фрагмента. Это позволяет изменять ориентацию экрана.

Один из этих фрагментов имеет mapView, созданный с помощью библиотеки osmdroid, и этот фрагмент сохраняется (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(); 
} 

Si ан-эль Evento onCreateView Hago Эсте sencillo управления эль проблема- 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 вместо текущего.

Все это работает? Не стесняйтесь, дайте мне знать, я отредактирую свой ответ, если потребуется.

 Смежные вопросы

  • Нет связанных вопросов^_^