我有一个“哑”自定义Android小部件(如在View
中,而不是主屏幕小部件),我需要在屏幕旋转期间保留一些状态。这个PlayerWidget
本质上是一个媒体播放器UI,带有一些按钮(后退,前进,播放/暂停)和进度条。它通过getter暴露了UI的重要部分。
有一些单独的Activities
,每个都有一个专门的控制器对象 - 这些使用getter来更新是应该启用按钮,还是有“播放”或“暂停”图标,以及在接收来自后台Service
的回调时更新进度条。
例如,在一个控制器的“开始播放”方法中,它执行此操作:
mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);
有Activity
屏幕轮换通过onConfigurationChanged
处理 - 这会调用setContentView()
(因为纵向和横向之间的布局不同),并绑定新创建的< / em> PlayerWidget
到仍然存在的控制器对象。
工作正常:进度更新开始在新的小部件实例上发生,按钮按预期工作。
但是,按钮没有正确的图标,因为PlayerWidget
- 不知道它的控制器 - 不知道它是如何被使用的,因此它应该显示它。
我想知道最好的想法是编写getState
和restoreState
方法,父Activity
可以在新setContentView()
之前和之后调用,但是我有无法从Drawable
分配ImageButtons
- 或者在那里?
或者我考虑包装ImageButton
getters返回的PlayerWidget
个对象,以便我可以保存(以后恢复)控制器设置的Drawable
资源ID。
或者,当我将新的PlayerWidget
绑定到控制器时,控制器可能会有某种“基于set-widget-UI-state-on-current-controller-state”的方法?由于各种原因,这可能很复杂,但感觉就像是“正确”的做法。
对这个稍微漫无边际的问题的任何意见将不胜感激! :)
答案 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”的方法,这比我想象的要简单。