Сохранение и восстановление HashMap onSaveInstanceState из фрагмента в другое действие

Необходимо восстановить маркеры, которые хранятся в HashMap<String, Marker> markers;когда фрагмент открывается из другого действия.

Вот что я попробовал:

    HashMap<String, Marker> markers;
    //..

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //..
    this.markers = new HashMap<String, Marker>();

    // Restoring the markers on configuration changes
            if (savedInstanceState != null) {
                if (savedInstanceState.containsKey("markers")) {
                    markers = (HashMap<String, Marker>) savedInstanceState.getSerializable("markers");
                    if (markers != null) {

                        for (String key : markers.keySet()) {
                            Location location =
                                    new Location(markers.get(key).getPosition().latitude, markers.get(key).getPosition().longitude);
                            addMarker(key, location);
                        }
                    }
                }
            }

    return rootView;
    }

public void addMarker(String key, Location location) {

        //if (!key.equals(strUserID)) {
        Marker marker = this.mGoogleMap.addMarker(new MarkerOptions()
                .position(new LatLng(location.latitude, location.longitude))
                .icon(BitmapDescriptorFactory.defaultMarker()));
}

    //...

    @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putSerializable("markers", markers);
        }

Я хочу восстановить маркеры на фрагменте, когда фрагмент возобновляется из состояния паузы из другого действия. Например: операция A содержит фрагмент FA, из которого операция B вызывается на переднем плане, а затем при повторном нажатии снова открывается фрагмент FA:

     Activity A (Fragment FA)(Markers shown on map and should store hashmap `onSaveInstanceState(Bundle outState)` when while activity B is called) --->  Activity B  ---> (On Back-pressed restore markers from hashmap `if (savedInstanceState != null)`) Fragment FA.

1 ответ

Решение

Обратите внимание, что если:

  • A не звонит finish когда вы переключаетесь на B
  • A настроен так, чтобы оставаться на заднем стеке
  • FA настроен так, чтобы оставаться на заднем стеке

Затем, когда вы переключаетесь на B а затем нажмите обратно, A а также FA будет извлечен из бэк-стека, что означает, что вы получите их в том же состоянии, в котором они были до переключения B, В этом случае вам не нужно ничего делать - ваш HashMap все еще действует и содержит правильное содержание.

Однако, если системе нужна память, она может решить уничтожить "обратно сложенные" Activity а также Fragment случаи, в этом случае он будет вызывать onSaveInstanceState до уничтожения. Если вы сейчас вернетесь, то A а также FA будет воссоздан, и получит savedInstanceState параметр, содержащий сохраненное состояние. Просто используйте его, чтобы восстановить все, что вы хотите.

Практически, (при условии, что Marker класс реализован правильно) Я думаю, что ваш код в порядке, за исключением одной строки onCreateView:

this.markers = new HashMap<String, Marker>();

Если FA только что извлечен из бэк-стека (и не воссоздан), эта строка приводит к потере текущего состояния HashMap, Я предлагаю вам поставить эту строку в onCreateили просто инициализируйте эту карту после объявления:

private HashMap<String, Marker> markers = new HashMap<>();