У меня есть «тупой» пользовательский виджет Android (как в View
, а не виджет домашнего экрана), который мне нужно сохранять в каком-то состоянии при поворотах экрана. PlayerWidget
- это по сути пользовательский интерфейс медиаплеера с некоторыми кнопками (назад, вперед, воспроизведение / пауза) и индикатором выполнения. Он раскрывает важные биты интерфейса через геттеры.
Есть несколько отдельных Activities
, каждый из которых имеет специальный объект контроллера & mdash; они используют геттеры, чтобы обновить, должны ли кнопки быть активированы, или иметь значок «воспроизведение» или «пауза», и обновляют индикатор выполнения при получении обратных вызовов от фона Service
.
Например, в методе «начала воспроизведения» на одном контроллере он делает это:
mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);
Существует Activity
, где поворот экрана обрабатывается с помощью onConfigurationChanged
& mdash; это вызывает setContentView()
(потому что расположение отличается в книжной и альбомной ориентации) и связывает недавно созданный 1018 * PlayerWidget
с все еще существующим объектом контроллера.
Это работает отлично: обновления прогресса происходят на новом экземпляре виджета, а кнопки работают как положено.
Однако кнопки не имеют правильных значков, поскольку PlayerWidget
& mdash; не зная своего контроллера & mdash; не знает, как он используется и, следовательно, что он должен отображать.
Мне было интересно, лучше ли было бы написать getState
и restoreState
методы, которые родительский элемент Activity
может вызывать до и после нового setContentView()
, однако у меня нет способа разделить Drawable
из ImageButtons
& mdash; или есть?
Или я решил обернуть объекты ImageButton
, которые возвращает геттер PlayerWidget
, чтобы я мог сохранить (и, следовательно, позднее восстановить) идентификатор ресурса Drawable
, который устанавливает контроллер.
В качестве альтернативы, когда я связываю новый PlayerWidget
с контроллером, у контроллера может быть какой-то метод "set-widget-UI-state-based-on-current-controller-state"? Это потенциально сложно по разным причинам, но похоже на «правильный» способ сделать это.
Буду признателен за любой вклад в эту слегка бессвязную проблему! :)