保存和恢复非Parcelable UI状态哑部件
我有一个“哑巴”定制的Android窗口小部件(如View
,而不是一个主屏幕小部件),我需要有在屏幕旋转保持一定的状态。这PlayerWidget
本质上是一个媒体播放器用户界面与一些按钮(后退,前进,播放/暂停)和进度条。它通过getter公开了UI的重要部分。保存和恢复非Parcelable UI状态哑部件
有几个独立的Activities
,每个都有一个专门的控制器对象—这些使用getter方法来更新的按钮是否应该启用,或有一个“播放”或“暂停”图标,并更新进度因为它从背景Service
收到回调。
例如,在一个控制器的“开始播放”的方法,它这样做:
mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);
有一个Activity
,其中屏幕旋转通过onConfigurationChanged
—这个调用处理setContentView()
(因为布局纵向和横向之间的区别),以及结合新创建PlayerWidget
到仍然存在控制器对象。
这工作正常:进度更新开始在新的widget实例发生和按钮正常工作。
然而,由于PlayerWidget
—没有它的控制器—的知识不知道如何使用它,因此它应该显示的按钮不正确的图标。
我在想,最好的办法是否有必要写getState
和restoreState
方法父Activity
之前和新setContentView()
后打电话,但是我没有parceling从ImageButtons
—一个Drawable
的方式还是有?
或者我认为包裹ImageButton
对象将PlayerWidget
干将回报,所以我能救(因此后恢复)Drawable
资源ID控制器套。或者,当我将新的PlayerWidget
绑定到控制器时,控制器可能会有某种“基于set-widget-UI-state-on-current-controller-state”的方法?由于各种原因,这可能很复杂,但感觉就像是“正确”的做法。
任何有关这个稍微散漫的问题的输入将不胜感激! :)
完成,我结束了使用“设置窗口小部件的UI状态为基础,导通电流控制器状态”的方法,这比我想象的简单。
这是一个有点劈,但你可以存储可绘制的资源ID在你的widget。所以,在你的widget有这样一些代码:
private int mMiddleButtonImage;
public void setMiddleButtonImage(int resourceId) {
mMiddleButtonImage = resourceId;
getMiddleButton().setImageResource(resourceId);
}
的getState()
和restoreState()
方法可以再使用整数资源ID,而不是可绘制自己。
是的。虽然消费者也需要在按钮上调用像setEnabled()这样的东西,这就是为什么我提到返回一个包装版本的ImageButton,而不是依赖用户调用控件上的特定方法来设置按钮图像的原因。包装的ImageButton会像你一样捕获保存/恢复的值。 – 2010-01-26 14:30:40
@Christopher - 你确实在你的问题中提出了我的回答;对不起,我第一次看到它时错过了。我认为这种方法会更好,因为存储int ID比parcelling或序列化Drawable要快得多,这可能是不可能的。 commonsguy在另一篇文章中也提到Bitmaps在Android内存模型中以某种特殊方式处理,所以我认为让它们独立并且记住这些ID是最好的。 – 2010-01-26 14:42:02