Сохранение и восстановление состояния неразборчивого пользовательского интерфейса для тупого виджета - PullRequest
1 голос
/ 26 января 2010

У меня есть «тупой» пользовательский виджет 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"? Это потенциально сложно по разным причинам, но похоже на «правильный» способ сделать это.

Буду признателен за любой вклад в эту слегка бессвязную проблему! :)

Ответы [ 2 ]

0 голосов
/ 20 ноября 2012

Для завершения я использовал подход «set-widget-UI-state-based-on-current-controller-state», который был проще, чем я думал.

0 голосов
/ 26 января 2010

Это немного взломано, но вы можете хранить идентификаторы ресурсов для рисования в вашем виджете. Так что на вашем виджете есть код вроде:

private int mMiddleButtonImage;

public void setMiddleButtonImage(int resourceId) {
    mMiddleButtonImage = resourceId;
    getMiddleButton().setImageResource(resourceId);
}

Методы getState() и restoreState() могут затем использовать целочисленные идентификаторы ресурсов, а не сами рисованные элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...