Java 保存和恢复哑小部件的不可包裹UI状态

Java 保存和恢复哑小部件的不可包裹UI状态,java,android,model-view-controller,user-interface,Java,Android,Model View Controller,User Interface,我有一个“哑”的定制Android小部件(如视图中的,而不是主屏幕小部件),我需要在屏幕旋转期间保留一些状态。这个PlayerWidget本质上是一个媒体播放器UI,带有一些按钮(后退、前进、播放/暂停)和一个进度条。它通过getter公开UI的重要部分 有几个独立的活动,每个活动都有一个专门的控制器对象-这些活动使用getter更新按钮是否应该启用,或者是否有“播放”或“暂停”图标,并在接收后台服务的回调时更新进度条 例如,在一个控制器的“开始播放”方法中,它执行以下操作: mWidget.g

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

有几个独立的
活动
,每个活动都有一个专门的控制器对象-这些活动使用getter更新按钮是否应该启用,或者是否有“播放”或“暂停”图标,并在接收后台
服务
的回调时更新进度条

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

mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);
有一个
活动
通过处理屏幕旋转-调用
setContentView()
(因为纵向和横向布局不同),并将新创建的
PlayerWidget
绑定到仍然存在的控制器对象

这很好:在新的小部件实例上开始进行进度更新,按钮按预期工作

但是,按钮没有正确的图标,因为
播放器Widget
(不知道其控制器)不知道它是如何使用的,因此不知道它应该显示什么

我想知道最好的办法是编写
getState
restoreState
方法,父
活动可以在新的
setContentView()
前后调用这些方法,但是我无法从
ImageButtons
中打包一个
Drawable
,或者是否存在

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

或者,当我将一个新的
PlayerWidget
绑定到控制器时,控制器可以有某种“基于当前控制器状态设置小部件UI状态”的方法?由于各种原因,这可能很复杂,但感觉这是一种“正确”的方式


如果您对这个略显杂乱的问题有任何意见,我们将不胜感激!:)

这是一个小技巧,但是您可以在小部件中存储Drawable的资源ID。因此,在您的小部件上有如下代码:

private int mMiddleButtonImage;

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

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

为了完成此任务,我最终使用了“基于当前控制器状态设置小部件UI状态”的方法,这比我想象的要简单。

是的。尽管消费者也需要在按钮上调用
setEnabled()
之类的东西,这就是为什么我提到返回包装版本的
ImageButton
,而不是依赖用户在小部件上调用特定的方法来设置按钮图像。包装的
ImageButton
将有一个像您一样的方法来捕获保存/还原的值。@Christopher-您确实在您的问题中建议了我的答案;很抱歉,我第一次读的时候错过了。我认为这种方法更可取,因为存储int-id要比打包或序列化绘图表快得多,这可能是不可能的。commonsguy在另一篇文章中还提到,在Android内存模型中,位图是以某种特殊方式处理的,因此我认为最好不要使用位图,只需记住ID即可。