Android方向更改时保存状态

ctehm74n  于 2023-02-06  发布在  Android
关注(0)|答案(2)|浏览(137)

我有一个Android应用程序,它维护有关行驶距离、经过时间等的状态。我可以方便地将此状态存储在对象中,并在Android调用onDestroy时将对该对象的引用存储在Bundle中()当用户更改屏幕方向时,然后在onCreate中恢复状态(Bundle savedBundle)。然而,我也有一些状态在屏幕上的Buttons和EditText对象中,我想通过屏幕方向来持久化。例如,在onStart(Bundle savedBundle)中,我调用:

_timerButton.setBackgroundColor(Color.GREEN);
_pauseButton.setBackgroundColor(Color.YELLOW);
_pauseButton.setEnabled(false);

然后在我的应用的整个操作过程中,这些按钮的颜色/启用状态会发生变化。有没有更方便的方法来持久化用户界面项(EditText,Button对象等)的状态,而不必手动保存/恢复每个按钮的每个属性?在屏幕方向之间手动管理这种类型的状态感觉真的很笨拙。
谢谢你的帮助。

puruo6ea

puruo6ea1#

在清单文件中添加android:configChanges

<activity name= ".MainActivity" 
 android:configChanges="orientation|screenSize"/>

默认情况下,这不起作用,因为更改方向会导致再次调用onCreate方法并重画视图。
但是,如果包含此参数,则框架将在方向更改时处理保留屏幕或布局的状态。

有关详细信息,请参阅以下官方文档:

Activity Lifecycle
Handling configuration changes

htrmnn0y

htrmnn0y2#

要保存变量或值,应使用onSaveInstanceState(Bundle);当方向发生变化时,应恢复值,也应使用onRestoreInstanceState(),但不是很常见。(**onRestoreInstanceState()在onStart()之后调用,而onCreate()在onStart()之前调用。使用put方法将值存储在onSaveInstanceState()**中

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

并恢复**onCreate()**中的值:

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}

相关问题