【问题标题】:Best way to persist data between orientation changes in Android在 Android 中的方向更改之间保留数据的最佳方法
【发布时间】:2012-07-20 19:51:47
【问题描述】:

我的教育应用程序有一个包含 6 到 7 个选项卡的选项卡主机,支持横向和纵向模式。在与选项卡关联的每个活动中,我在列表视图中显示一些学生记录,一些复选框用于选择和一些评分栏、按钮等。我通过 Web 服务调用从远程服务器获取这些学生记录。由于某些原因,我的应用程序将在执行一些操作/搜索后显示一个带有一些按钮的初始相对布局它将在列表视图中显示结果,在单击列表视图中的列表项或按钮时,我将显示一些其他布局。这适用于选项卡主机中的所有活动。

如果用户改变方向,我必须恢复相同的状态或相同的屏幕,这意味着如果用户以前看到记录列表,我必须显示记录列表,如果初始我必须只显示初始。我不想强制停止 android 在方向更改或覆盖 public Object onRetainNonConfigurationInstance () 时破坏活动。正如一些博客和 android 文档中所建议的那样,这些可能会导致以后的操作出现问题。我所做的只是在onSaveInstanceState Bundle 中保存所有必需的信息,例如哪个屏幕1 或2 或3、文本视图标签和所有原始数据类型,并在onRestoreInstanceState 中恢复它们。此外,我正在将我的自定义搜索结果对象数组写入文件,并在 onSaveInstanceState 和 onRestoreInstanceStates 之间检索和删除它。由于我的搜索结果有 100 多个对象,并且我存储了大量的原始数据类型列表,当用户快速旋转设备时,堆大小会迅速增加。

最好的办法是什么

1) 坚持 onSaveInstanceState 和 onRestoreInstanceStates,这会使我的屏幕空白一段时间并增加堆大小,当用户旋转多次时不一定执行保存和恢复

2) 将所有需要的数据保持为静态,因为它不是活动的本地数据,因此不会破坏

3) 通过扩展 Application 类来保留所有需要的数据?

【问题讨论】:

  • 如果您遵循您的第三点,那就更好了。 .
  • @AndroSelva 表示作为应用程序类中的静态数据,我拥有大量数据。
  • 不,我不希望每次屏幕旋转时都进行数据库操作,这就是我将搜索结果 obj 写入文件的原因。
  • 听说过共享偏好??可能会对你有所帮助。

标签: android android-orientation


【解决方案1】:

您还可以使用可以通过方向更改保留的片段。

【讨论】:

【解决方案2】:

如果方向配置发生变化(您可以添加侦听器),我建议您从清单和程序中修复方向,您可以调整视图,因为看起来方向已更改。通过这种方式,您可以保存数据以及不必要的内存存储。动态对齐和重新定位视图不会含糊,不用担心。

  // Add inside manifest.
  android:configChanges="orientation|keyboardHidden"

  // Reposition your views
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        align_landscape();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        align_portrait();
    }
}

【讨论】:

  • @Arflin 我怀疑像上面这样强制停止活动破坏可能会导致问题,尤其是在您处理语言环境或多个屏幕时。
  • 我很久以前就遇到过同样的问题,并以同样的方式解决了。这里的视图是指您在屏幕上显示的任何视图,例如按钮、文本视图、列表视图等......屏幕将只有一个。
  • 但我的视图状态将根据用户操作动态变化,例如第一次 btn 点击 btn 背景可能是蓝色,第二次点击它是红色,第三次可能是其他颜色等。所以我有跟踪所有这些变化。如果是带有一组数据的单个列表视图,那么你的解决方案绝对没问题。
  • 是的,您需要跟踪,您可以轻松地为您的按钮状态维护一个标志。希望与其他解决方案相比更好、更容易..
猜你喜欢
  • 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
相关资源
最近更新 更多