В одном из занятий у меня есть HashSet<Integer> mSelectedPositions
. Я хочу сохранить состояние этого набора при повороте экрана.
@Override
protected void onSaveInstanceState(@NotNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(SELECTED_TYPES_POSITIONS, mSelectedPositions);
}
И восстановить его
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!= null && savedInstanceState.containsKey(SELECTED_TYPES_POSITIONS)){
mSelectedPositions = (HashSet<Integer>) savedInstanceState.getSerializable(SELECTED_TYPES_POSITIONS);
}
...
}
Проблема в том, что getSerializable(..)
возвращает пустое HashSet
, даже если оно не было пустым в putSerializable(..)
.
Что еще страннее, у меня есть почти такой же код (с другими ключами) в других фрагментах, и он отлично работает.
Не знаю, имеет ли значение, но рассматриваемая деятельность является дочерней по отношению к MainActivity.
Upd
Часть проблемы связана с процессом выбора. При уничтожении активности режим действия завершен.
@Override
protected void onDestroy() {
if(mActionMode != null){
mActionMode.finish();
}
super.onDestroy();
}
Что вызывает
@Override
public void onDestroyActionMode(ActionMode mode) {
mAdapter.clearSelections();
mActivity.nullifyActionMode();
}
в SelectionCallback
.
Я думаю, что происходит следующее:
1. Я положил mSelectedPositions
в outState
Bundle, он хранит ссылку
2. Активность уничтожена
3. SelectionCallback очищает mSelectedPositions
4. Фактическая сериализация происходит с пустым HashSet.
Итак, я внес некоторые изменения - новый HashSet с копией mSelectedPositions
data
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(SELECTED_TYPES_POSITIONS, new HashSet<>(mSelectedPositions));
}
И он работает как надо.
Upd2
Во фрагментах я называю mActionMode.finish()
в onDetach()
, что не вызывается при повороте экрана, поэтому mSelectedPositions
остается неизменным.