2010-01-26 96 views
1

我有一个“哑巴”定制的Android窗口小部件(如View,而不是一个主屏幕小部件),我需要有在屏幕旋转保持一定的状态。这PlayerWidget本质上是一个媒体播放器用户界面与一些按钮(后退,前进,播放/暂停)和进度条。它通过getter公开了UI的重要部分。保存和恢复非Parcelable UI状态哑部件

有几个独立的Activities,每个都有一个专门的控制器对象—这些使用getter方法来更新的按钮是否应该启用,或有一个“播放”或“暂停”图标,并更新进度因为它从背景Service收到回调。

例如,在一个控制器的“开始播放”的方法,它这样做:

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

有一个Activity,其中屏幕旋转通过onConfigurationChanged —这个调用处理setContentView()(因为布局纵向和横向之间的区别),以及结合新创建PlayerWidget仍然存在控制器对象。

这工作正常:进度更新开始在新的widget实例发生和按钮正常工作。

然而,由于PlayerWidget —没有它的控制器—的知识不知道如何使用它,因此它应该显示的按钮不正确的图标。

我在想,最好的办法是否有必要写getStaterestoreState方法父Activity之前和新setContentView()后打电话,但是我没有parceling从ImageButtons —一个Drawable的方式还是有?

或者我认为包裹ImageButton对象将PlayerWidget干将回报,所以我能救(因此后恢复)Drawable资源ID控制器套。或者,当我将新的PlayerWidget绑定到控制器时,控制器可能会有某种“基于set-widget-UI-state-on-current-controller-state”的方法?由于各种原因,这可能很复杂,但感觉就像是“正确”的做法。

任何有关这个稍微散漫的问题的输入将不胜感激! :)

回答

0

完成,我结束了使用“设置窗口小部件的UI状态为基础,导通电流控制器状态”的方法,这比我想象的简单。

0

这是一个有点劈,但你可以存储可绘制的资源ID在你的widget。所以,在你的widget有这样一些代码:

private int mMiddleButtonImage; 

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

getState()restoreState()方法可以再使用整数资源ID,而不是可绘制自己。

+0

是的。虽然消费者也需要在按钮上调用像setEnabled()这样的东西,这就是为什么我提到返回一个包装版本的ImageButton,而不是依赖用户调用控件上的特定方法来设置按钮图像的原因。包装的ImageButton会像你一样捕获保存/恢复的值。 – 2010-01-26 14:30:40

+0

@Christopher - 你确实在你的问题中提出了我的回答;对不起,我第一次看到它时错过了。我认为这种方法会更好,因为存储int ID比parcelling或序列化Drawable要快得多,这可能是不可能的。 commonsguy在另一篇文章中也提到Bitmaps在Android内存模型中以某种特殊方式处理,所以我认为让它们独立并且记住这些ID是最好的。 – 2010-01-26 14:42:02