代码之家  ›  专栏  ›  技术社区  ›  Christopher Orr

保存和恢复哑小部件的非Parcelable UI状态

  •  1
  • Christopher Orr  · 技术社区  · 14 年前

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

    有几个单独的 Activities ,每个都有一个专门的控制器对象-这些对象使用getter更新按钮是应该启用,还是有一个“播放”或“暂停”图标,并在收到来自后台的回调时更新进度条。 Service .

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

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

    有一个 Activity 屏幕旋转通过 onConfigurationChanged -这个电话 setContentView() (因为布局在纵向和横向上有所不同),并将 新创建的 播放器小部件 仍然存在 控制器对象。

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

    但是,按钮没有正确的图标,因为 播放小部件 -不知道它的控制器-不知道它是如何使用的,因此它应该显示什么。

    我想知道最好的办法是写 getState restoreState 方法 活动 可以在新的 设置内容视图() 但是我没有办法 Drawable ImageButtons -还是有?

    或者我考虑包装 ImageButton 对象 播放小部件 getter返回,以便我可以保存 可拉伸的 控制器设置的资源ID。

    或者,当我绑定新的 播放小部件 对于控制器,控制器可以有某种“基于当前控制器状态设置小部件用户界面状态”的方法?由于各种原因,这可能很复杂,但感觉这是一种“正确”的做法。

    任何有关这个稍微杂乱无章的问题的意见都将受到赞赏!:)

    2 回复  |  直到 12 年前
        1
  •  0
  •   David Webb    14 年前

    这是一个有点黑客,但您可以存储在您的小部件中的抽屉的资源ID。所以在你的小部件上有一些代码,比如:

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

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

        2
  •  0
  •   Christopher Orr    12 年前

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