【问题标题】:How do I save state for bitmap images within GridView when orientation changes?当方向改变时,如何在 GridView 中保存位图图像的状态?
【发布时间】:2018-03-18 22:10:53
【问题描述】:

所以我正在创建一个滑动益智游戏应用程序,并且当前使用在活动的 onCreate 方法中创建的位图数组列表填充 GridView。然后我使用 Collections.swap 来交换这些图像,然后我重新加载我的 GridView 以更新屏幕上的 GridView。

在手机的方向改变之前,这非常有效。 GridView 图像(拼图图块)返回到它们的开始发布状态(在 Collections.swap 之前)。

我已经能够通过使用 SharedPreferences 来保存轮换分数,这非常有效。但是,我不知道如何将位图或位图的 ArrayList 保存到 SharedPreferences。有没有办法做到这一点?或者有其他选择吗?

【问题讨论】:

  • 如果您不想出现 OutOfMemory 异常,请不要存储位图,首先要考虑如何将链接/路径/url.. 存储到该位图。

标签: java android gridview android-sharedpreferences


【解决方案1】:

我通过创建一个 onSavedInstanceState 方法来改变方向,该方法使用 state.putSerializable 保存了我的列表数组:

@Override
protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putSerializable(tileLocationsKey, puzzleTilesList);
}

然后我通过执行以下操作检查它们是否是我的 onCreate 方法中保存的实例状态:

if ((savedInstanceState != null) && (savedInstanceState.getSerializable(tileLocationsKey) != null)) {
    puzzleTilesList = (ArrayList<Bitmap>) savedInstanceState.getSerializable(tileLocationsKey);
}

如果 != null 则使用保存的列表数组。

【讨论】:

  • 这些Bitmaps 有多大?在某些情况下(但不是,当您只是旋转您的设备时),您写入信息的Bundle 将被传递到活页夹事务,并且对这些有一些限制性的大小限制。
  • 是的,我刚刚注意到,如果我退出应用程序并重新打开它,它似乎无法正确保存,但是,当我旋转时它确实可以正常工作。我该如何解决这个问题?
  • 位图大小不同,因为有一堆从网站下载并存储在数组中
  • 我假设您有某种方法可以生成这些位图,对吧?理论上,当您第一次在新游戏上设置棋盘时,您会这样做。我要做的是保存位图 indexes 列表而不是位图本身,然后创建一个新游戏并重新排列列表以匹配旋转之前的列表。
  • 另外,onSaveInstanceState() 仅在应用未退出时适用。如果操作系统终止您的进程以节省内存,它将让您的数据继续存在,但如果用户从“最近”屏幕退出应用程序,onSaveInstanceState() 将不会做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多