Android在方向更改时保存状态

Int*_*ion 28 android state ondestroy android-bundle

我有一个Android应用程序,它维护有关行进距离,时间流逝等的状态.当用户更改屏幕时Android调用onDestroy()时,我可以方便地存储在对象中并在Bundle中存储对该对象的引用方向,然后恢复onCreate(Bundle savedBundle)中的状态.但是,我在屏幕上的Buttons和EditText对象中也有一些状态,我希望通过屏幕方向保持这种状态.例如,在onStart(Bundle savedBundle)中我调用:

_timerButton.setBackgroundColor(Color.GREEN);
_pauseButton.setBackgroundColor(Color.YELLOW);
_pauseButton.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

然后在我的应用程序的整个操作过程中,这些按钮的颜色/启用状态将被更改.是否有更方便的方法来持久保存用户界面项(EditText,Button对象等)的状态,而无需手动保存/恢复每个按钮的每个属性?在屏幕方向之间手动管理这种类型的状态感觉非常笨拙.

谢谢你的帮助.

Ran*_*mar 85

你尝试过使用过吗?

<activity name= ".YourActivity" android:configChanges="orientation|screenSize"/>
Run Code Online (Sandbox Code Playgroud)

在清单文件?

默认情况下它不起作用,因为当您更改方向时,onCreate将再次调用它并重绘您的视图.

如果你写这个参数不需要在Activity中处理,那么框架将处理其余的事情.如果方向改变,它将保持屏幕或布局的状态.

注意 如果为横向模式使用不同的布局,则通过添加这些参数,将不会调用横向模式的布局.

其他方式另一种方式

  • 问题在于它使得为不同方向显示不同的视图更加难以实现,因为不再调用Activity的onCreate()方法,因此忽略onCreate()中调用的任何重要内容. (8认同)
  • 哇,真的很简单......在我的清单中添加这一行解决了我的问题.现在我的所有状态似乎都会持续进行方向更改,而无需在Bundle中手动保存状态.onCreate/onDestroy也不再调整方向更改.谢谢你! (3认同)
  • 我是Android的新手,我不相信那么简单.有什么收获?为什么默认情况下不启用?这一定有某种缺点.. (3认同)
  • 很好的答案,帮助我理解"configChanges" (2认同)

And*_*der 15

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

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}
Run Code Online (Sandbox Code Playgroud)

并恢复onCreate()中的值:

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢回复.我实际上是在寻找一种方法,不必在onCreate和onSaveInstanceState上进行这种手动捆绑管理工作,这就是为什么我接受了ranjith的答案 - 但这对于这个问题肯定是个好消息. (2认同)