【问题标题】:Best practice for handling state change during screen rotation在屏幕旋转期间处理状态变化的最佳实践
【发布时间】:2013-05-14 00:57:56
【问题描述】:

我有一个带有微调器和切换按钮的非常简单的程序。 当按钮打开时,我禁用微调器,并在我关闭时启用。 我遇到了一个问题,这意味着在屏幕旋转期间重新启用了微调器。 我知道这是由于活动状态发生变化和 onCreate 再次被调用,但我还没有找到关于在这种情况下视图状态的最佳实践的明确答案。

注意:我发现的与此相关的最相关的 SO 问题如下。所有 3 人都讨论了如何处理状态更改(onPause/OnResume 与覆盖 onSaveInstanceState),但似乎没有人明确说明对于这样简单的事情,哪个是首选选项。

Losing data when rotate screen

Saving Android Activity state using Save Instance State

Android CheckBox -- Restoring State After Screen Rotation

【问题讨论】:

  • 显然对这个 Android 百灵鸟来说是一个 n00b,所以如果没有明确的选择,请告诉我。只想掌握基础知识而不是学习坏习惯。
  • 干杯。这似乎是普遍的共识。我是否正确假设它会自动处理 savedInstanceState 中的切换、微调器选择等,但由于启用不是“正常”属性来检查它默认情况下不处理,这就是为什么必须手动完成?
  • 嗯,看起来另一个答案被删除了。如果你想在下面给出一个框架答案,我可以接受。再次感谢大家的讨论。
  • 查看本教程以使用保存的实例状态包处理活动状态quicktips.in/…

标签: android


【解决方案1】:

Saving Android Activity state using Save Instance State 接受的答案是要走的路。

使用onSaveInstanceState 保存一个布尔标志,指示是否禁用微调器,然后读取onCreate(或onRestoreInstanceState)中的标志并根据需要禁用微调器。

如果你在 XML 布局中给你的视图一个 android:id 并且没有明确地将 android:saveEnabled 设置为 false,它们的“状态”将被自动保存和恢复。例如,对于文本视图,这包括当前在视图中的文本和光标的位置。但是,启用/禁用状态似乎不是此“状态”的一部分。

【讨论】:

  • 完美,谢谢。我的视图被赋予了一个 android:id,但证实了我对启用状态被排除的怀疑。
【解决方案2】:

System如何自动保留ListView的滚动位置?

您可能已经注意到,即使您没有处理 onSaveInstanceState 方法,某些数据在轮换期间也不会受到影响。例如

  • EditText 中的滚动位置文本
  • EditText 等中的文本

屏幕旋转时会发生什么?

当屏幕旋转时,系统会终止 Activity 的实例并重新创建一个新实例。系统这样做是为了为不同配置的活动提供最合适的资源。当一个完整的活动进入多窗格屏幕时,也会发生同样的事情。

系统如何重新创建一个新的Instance?

系统使用 Activity 实例的旧状态创建一个新实例,称为“instance state”。 Instance State 是存储在BundleObject 中的键值对的集合。

例如,默认情况下系统将视图对象保存在 Bundle 中。 例如滚动位置EditText等。

因此,如果您想保存应该在方向更改后保留的其他数据,您应该覆盖onSaveInstanceState(Bundle saveInstanceState) 方法。

重写 onSaveInstance 方法时要小心!!!

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
     // Save the user's current game state
     savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

始终调用super.onSaveInstanceState(savedInstanceState) ekse,默认行为将不起作用。即 EditText 值在定向期间不会持续存在。不相信我吗? Go and check this code.

恢复数据时使用哪种方法?

  • onCreate(Bundle savedInstanceState)

  • onRestoreInstanceState(Bundle savedInstanceState)

这两种方法都获得相同的 Bundle 对象,因此在哪里编写恢复逻辑并不重要。唯一的区别是,在onCreate(Bundle savedInstanceState) 方法中,您必须进行空检查,而在后一种情况下不需要。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mTextView = (TextView) findViewById(R.id.main);
        if (savedInstanceState != null) {
              CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE);
              mTextView.setText(savedText);
        }
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}

总是打电话给super.onRestoreInstanceState(savedInstanceState),这样 系统默认恢复视图层次结构。

【讨论】:

    【解决方案3】:
     <activity
            android:name="com.rax.photox.searchx.MainActivity"
    
            android:configChanges="keyboardHidden|orientation|screenSize"
    

    它非常适合我

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2015-04-06
      • 2014-09-04
      • 1970-01-01
      相关资源
      最近更新 更多