Сохранение и восстановление 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<>();