我有一个带有EditText和imageview以及按钮的小活动。当您按下按钮时,它会启动相机以获得结果,当它返回时,它会将图像视图更改为您刚刚拍摄的图像。
但是当方向改变时,imageview将重置为布局上的默认值。
我尝试做的是设置一个名为custom的布尔值,当你拍照时,它将其设置为true。我覆盖onConfigurationChanged(),如果custom设置为true,我恢复图像。
我现在的问题是EditText被删除了 - 如何在配置更改后恢复EditText?我的第一次尝试是将它的内容存储到String onPause()然后恢复它,但它总是空白。
答案 0 :(得分:15)
通常当UI视图不保持其状态时,首先要检查的是该UI视图是否已分配id。没有这个id视图就无法恢复它们的状态。
<EditText android:id="@+id/text" ... />
如果这没有帮助,您需要自己保存和恢复状态。看看Handling Runtime Changes。它几乎解释了你应该做什么:
要正确处理重新启动,您的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()
并返回任何将在重新创建时传递给新活动对象的自定义对象。有关如何使用它的更多详细信息,请参阅Handling Runtime Changes。但是这个功能在Android 3.0+中已被弃用(特别是对于最终的FragmentActivity
)。因此,这不能与Fragments一起使用(很好,它们的机制可以保留配置更改中的对象)。
最后一个 - 永远不要使用android:configChanges
。你必须有充分的理由使用它,通常这些是性能原因。它并不意味着以现在的方式被滥用:只是为了防止UI状态重置。如果使用此属性,则是,在配置更改时不会重新设置活动UI,但在销毁并稍后重新创建活动状态时仍将重置。
文档很好地解释了这个选项:
注意:自己处理配置更改可以使其更多 难以使用替代资源,因为系统没有 自动为您应用它们。 应该考虑这种技术 最后的手段,不建议用于大多数应用程序
答案 1 :(得分:4)
通过将android:configChanges="orientation"
添加到清单中的活动行,您可以强制不要在更改方向后重新加载活动。