通常情况下,当UI视图无法保持其状态时,需要检查的第一件事是该UI视图是否已分配ID。如果没有ID,则视图无法恢复其状态。
<EditText android:id="@+id/text" ... />
如果这不起作用,您需要自己保存和恢复状态。请参阅
处理运行时更改。它基本上解释了您应该做什么:
为了正确处理重新启动,重要的是您的Activity通过正常的Activity生命周期来恢复其先前的状态,在其中Android在销毁Activity之前调用
onSaveInstanceState()
,以便您可以保存有关应用程序状态的数据。然后您可以在
onCreate()
或
onRestoreInstanceState()
期间恢复状态。为了测试您的应用程序在保持应用程序状态的情况下重新启动,您应该在执行应用程序中的各种任务时调用配置更改(例如更改屏幕方向)。
当调用时,您应该覆盖
onSaveInstanceState()
并保存您的Acitivity状态:
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putString("textKey", mEditText.getText().toString());
}
然后在onCreate()
或者onRestoreInstanceState()
中恢复状态:
public void onCreate(Bundle savedInstanceState)
{
if(savedInstanceState != null)
{
mEditText.setText(savedInstanceState.getString("textKey"));
}
}
如果这还不够,你可以重写
onRetainNonConfigurationInstance()
并返回任何自定义对象,该对象将传递给新的活动对象在其重新创建时。有关如何使用它的更多详细信息,请参见
处理运行时更改。但是,在Android 3.0+中,
FragmentActivity
中的此函数已被弃用(特别是 final)。因此,无法与 Fragment 一起使用(这没关系,它们有自己的机制来保留跨配置更改的对象)。
最后一个建议:永远不要使用android:configChanges
。你必须有非常好的理由才能使用它,通常这些理由是出于性能方面的考虑。它并不是用来像现在这样被滥用:仅仅为了防止UI状态重置。如果使用了这个属性,那么是的,在配置更改时Activity UI将不会被重新设置,但是当Activity销毁并在以后重新创建时,Activity状态仍将被重置。
文档对这个选项进行了很好的解释:
注意:自己处理配置更改可能会使使用替代资源变得更加困难,因为系统不会自动为您应用它们。此技术应该被视为最后的手段,不推荐大多数应用程序使用。
onSaveInstanceState()
函数中保存位图路径。如果位图在内存中,则可以使用onRetainNonConfigurationInstance()
函数。 - inazaruk