我的观点正在改变方向变化

时间:2011-08-17 06:40:37

标签: android android-layout android-edittext android-orientation onconfigurationchanged

我有一个带有EditText和imageview以及按钮的小活动。当您按下按钮时,它会启动相机以获得结果,当它返回时,它会将图像视图更改为您刚刚拍摄的图像。

但是当方向改变时,imageview将重置为布局上的默认值。

我尝试做的是设置一个名为custom的布尔值,当你拍照时,它将其设置为true。我覆盖onConfigurationChanged(),如果custom设置为true,我恢复图像。

我现在的问题是EditText被删除了 - 如何在配置更改后恢复EditText?我的第一次尝试是将它的内容存储到String onPause()然后恢复它,但它总是空白。

2 个答案:

答案 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"添加到清单中的活动行,您可以强制不要在更改方向后重新加载活动。