【问题标题】:Saving and restoring non-Parcelable UI state for a dumb widget为哑小部件保存和恢复非 Parcelable UI 状态
【发布时间】: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 不知道它的控制器 - 不知道它是如何被使用的,因此不知道它应该显示什么。

我想知道最好的办法是编写getStaterestoreState 方法,父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


    【解决方案1】:

    这有点小技巧,但您可以将可绘制对象的资源 ID 存储在小部件中。所以在你的小部件上有一些代码,如:

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

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

    【讨论】:

    • 是的。虽然消费者还需要在按钮上调用setEnabled() 之类的东西,这就是为什么我提到返回ImageButton 的包装版本,而不是依靠用户调用小部件上的特定方法来设置按钮图像。包装的ImageButton 将有一个像你这样的方法来捕获保存/恢复的值。
    • @Christopher - 你确实在你的问题中提出了我的答案;很抱歉我错过了第一次阅读它。我认为这种方法会更可取,因为存储 int ID 会比打包或序列化 Drawable 快得多,这可能是不可能的。 commonsguy 在另一篇文章中还提到,位图在 Android 内存模型中以某种特殊方式处理,所以我认为最好不要管它们,只记住 ID。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多