【发布时间】:2010-01-26 12:55:08
【问题描述】:
我有一个“愚蠢”的自定义 Android 小部件(如 View,不是主屏幕小部件),我需要在屏幕旋转期间保留一些状态。这个PlayerWidget 本质上是一个带有一些按钮(后退、前进、播放/暂停)和进度条的媒体播放器 UI。它通过 getter 暴露 UI 的重要部分。
有几个单独的Activities,每个都有一个专门的控制器对象——它们使用getter来更新按钮是否应该启用,或者有一个“播放”或“暂停”图标,并更新进度条,因为它从后台接收回调Service。
例如,在一个控制器的“开始播放”方法中,它会这样做:
mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause);
有一个Activity,其中屏幕旋转是通过onConfigurationChanged 处理的——这调用setContentView()(因为纵向和横向的布局不同),并绑定新创建的 PlayerWidget到仍然存在的控制器对象。
效果很好:新的小部件实例上开始进行进度更新,并且按钮按预期工作。
但是,这些按钮没有正确的图标,因为 PlayerWidget 不知道它的控制器 - 不知道它是如何被使用的,因此不知道它应该显示什么。
我想知道最好的办法是编写getState 和restoreState 方法,父Activity 可以在新setContentView() 之前和之后调用,但是我无法打包Drawable来自ImageButtons——或者那里有?
或者我考虑包装 PlayerWidget getter 返回的 ImageButton 对象,以便我可以保存(并因此稍后恢复)控制器设置的 Drawable 资源 ID。
或者,当我将新的PlayerWidget 绑定到控制器时,控制器可能有某种“set-widget-UI-state-based-on-current-controller-state”方法?由于各种原因,这可能很复杂,但感觉是“正确”的做法。
任何关于这个有点杂乱的问题的意见将不胜感激! :)
【问题讨论】:
标签: java android model-view-controller user-interface