保存并恢复哑小部件的非Parcelable UI状态

时间:2010-01-26 12:55:08

标签: java android model-view-controller user-interface

我有一个“哑”自定义Android小部件(如在View中,而不是主屏幕小部件),我需要在屏幕旋转期间保留一些状态。这个PlayerWidget本质上是一个媒体播放器UI,带有一些按钮(后退,前进,播放/暂停)和进度条。它通过getter暴露了UI的重要部分。

有一些单独的Activities,每个都有一个专门的控制器对象 - 这些使用getter来更新是应该启用按钮,还是有“播放”或“暂停”图标,以及在接收来自后台Service的回调时更新进度条。

例如,在一个控制器的“开始播放”方法中,它执行此操作:

mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);

Activity屏幕轮换通过onConfigurationChanged处理 - 这会调用setContentView()(因为纵向和横向之间的布局不同),并绑定新创建的< / em> PlayerWidget仍然存在的控制器对象。

工作正常:进度更新开始在新的小部件实例上发生,按钮按预期工作。

但是,按钮没有正确的图标,因为PlayerWidget - 不知道它的控制器 - 不知道它是如何被使用的,因此它应该显示它。

我想知道最好的想法是编写getStaterestoreState方法,父Activity可以在新setContentView()之前和之后调用,但是我有无法从Drawable分配ImageButtons - 或者在那里?

或者我考虑包装ImageButton getters返回的PlayerWidget个对象,以便我可以保存(以后恢复)控制器设置的Drawable资源ID。

或者,当我将新的PlayerWidget绑定到控制器时,控制器可能会有某种“基于set-widget-UI-state-on-current-controller-state”的方法?由于各种原因,这可能很复杂,但感觉就像是“正确”的做法。

对这个稍微漫无边际的问题的任何意见将不胜感激! :)

2 个答案:

答案 0 :(得分:0)

这有点黑客但你可以在你的小部件中存储drawable的资源ID。因此,在您的小部件上有一些代码,如:

private int mMiddleButtonImage;

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

getState()restoreState()方法可以使用整数资源ID而不是drawables本身。

答案 1 :(得分:0)

为了完成,我最终使用了“基于set-widget-UI-state-on-current-controller-state”的方法,这比我想象的要简单。