屏幕旋转期间处理状态变化的最佳实践

时间:2013-05-14 00:57:56

标签: android

我有一个非常简单的程序,带有微调器和toggleButton。 当按钮打开时,我禁用微调器,并在我关闭时启用。 我遇到过一个问题,意味着在屏幕旋转期间重新启用微调器。 我理解这是由于活动状态的变化和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

3 个答案:

答案 0 :(得分:5)

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

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

如果您在XML布局中为视图提供android:id并且未明确将android:saveEnabled设置为false,则会自动保存和恢复其“状态”。例如,对于文本视图,这包括当前在视图中的文本和光标的位置。但是,启用/禁用状态似乎不是此“状态”的一部分。

答案 1 :(得分:0)

系统如何自动保留ListView滚动位置?

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

  • EditText中的滚动文字
  • EditText中的文字等。

屏幕旋转时会发生什么?

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

系统如何重新创建新实例?

System使用名为“实例状态”的Activity实例的旧状态创建新实例。实例状态是存储在Bundle对象中的键值对的集合。

  

默认情况下,系统将View对象保存在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)

OR

  • 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)   系统默认恢复View层次结构。

答案 2 :(得分:0)

 <activity
        android:name="com.rax.photox.searchx.MainActivity"

        android:configChanges="keyboardHidden|orientation|screenSize"

对我来说很完美