3

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

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

旋转屏幕时丢失数据

使用 Save Instance State 保存 Android Activity 状态

Android CheckBox -- 屏幕旋转后恢复状态

4

3 回答 3

5

使用 Save Instance State 保存 Android 活动状态的公认答案是要走的路。

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

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

于 2013-05-14T01:29:17.073 回答
0
 <activity
        android:name="com.rax.photox.searchx.MainActivity"

        android:configChanges="keyboardHidden|orientation|screenSize"

它非常适合我

于 2020-04-15T02:46:21.947 回答
0

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

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

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

屏幕旋转时会发生什么?

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

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

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

例如,默认情况下系统将视图对象保存在 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 值在定向期间不会持续存在。不相信我吗?去检查这个代码

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

  • 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),以便系统默认恢复视图层次结构。

于 2017-12-12T06:59:28.880 回答