如何在方向改变时刷新Android RelativeLayout而不重新启动活动?

如何在方向改变时刷新Android RelativeLayout而不重新启动活动?,android,Android,我有一个带有RelativeLayout的Android活动,我实施了以下方法来防止在方向改变时重新创建该活动: @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } 很明显,我并没有用这种方法做任何事情,但当使用LinearLayout时,效果非常好。然而,现在,使用RelativeLayout

我有一个带有RelativeLayout的Android活动,我实施了以下方法来防止在方向改变时重新创建该活动:

@Override
public void onConfigurationChanged(Configuration newConfig) {       
    super.onConfigurationChanged(newConfig);

}
很明显,我并没有用这种方法做任何事情,但当使用LinearLayout时,效果非常好。然而,现在,使用RelativeLayout,当更改为横向时,我的布局完全混乱

在不通过调用onCreate重新启动活动的情况下,正确重画屏幕的最有效方法是什么?

您有两种方法:

  • 在配置更改期间保留对象
  • 自己处理配置更改
你选择了第二条路。在这种情况下,您必须手动重新分配每个资源,不建议使用这种方法

最好的方法是首先实现方法:onRetainonConfiguration Instance()

关于如何使用的完整示例

注意:将再次调用onCreate,但您可以调整代码,以防止在配置更改期间再次调用长运行任务。您有两种方法:

  • 在配置更改期间保留对象
  • 自己处理配置更改
你选择了第二条路。在这种情况下,您必须手动重新分配每个资源,不建议使用这种方法

最好的方法是首先实现方法:onRetainonConfiguration Instance()

关于如何使用的完整示例


注意:onCreate将被再次调用,但您可以调整代码,以防止在配置更改期间再次调用长时间运行任务。

Francescos answer中缺少第三种更简单的方法

加上

android:configChanges="keyboardHidden|orientation"
更改为从横向模式更改为纵向模式时不希望重新启动的每个活动的活动标记。这将导致操作系统重新生成布局,而不会在重新生成之前销毁布局。oncreate方法不会再次被调用,并且不会失去活动的状态。但是要小心,只有在纵向和横向模式下使用相同的布局文件时,这才有效


有关此主题的更多信息,请参见此

Francescos的答案中缺少第三种更简单的方法

加上

android:configChanges="keyboardHidden|orientation"
更改为从横向模式更改为纵向模式时不希望重新启动的每个活动的活动标记。这将导致操作系统重新生成布局,而不会在重新生成之前销毁布局。oncreate方法不会再次被调用,并且不会失去活动的状态。但是要小心,只有在纵向和横向模式下使用相同的布局文件时,这才有效


有关此主题的更多信息,请参见此

根据官方文档,添加android:configChanges=“keyboardHidden | orientation”只需声明一个活动,该活动将自行处理配置更改。所以我觉得这看起来像是我的第二个选项的另一个偏差,这是正确的。抱歉,若你们声明了这一点并覆盖了onConfigurationChanged,你们就有了第二个解决方案。事实上,第三种方法正是我在我的示例中所采用的方法。问题是它确实成功地为LinearLayout重新绘制了布局,但没有为RelativeLayout重新绘制布局——至少在Nexus 1上没有。根据官方文档,添加android:configChanges=“keyboardHidden | orientation”只是声明一个活动,它将自行处理配置更改。所以我觉得这看起来像是我的第二个选项的另一个偏差,这是正确的。抱歉,若你们声明了这一点并覆盖了onConfigurationChanged,你们就有了第二个解决方案。事实上,第三种方法正是我在我的示例中所采用的方法。问题是它确实成功地为LinearLayout重新绘制了布局,但没有为RelativeLayout重新绘制布局-至少在Nexus 1上没有。感谢您的建议。我读了你举的例子。因此,在我看来,使用onRetainonConfiguration Instance()实际上会杀死活动并重新启动它,但它提供了一种缓存加载的任何数据的方法。这很好,但是您仍然需要承担重新启动活动和重新加载所有视图的成本。。。但我想这正是必须做到的:)因此,如果使用onRetainonConfiguration实例(),我想我不应该将我的活动设置为:android:configChanges=“keyboardHidden | orientation”。我需要做的就是实现这个方法?您提到使用选项1我必须“手动重新分配每个资源”。重新分配每个资源意味着调用类似“TextView myView=findviewbyd(R.id.myTextView)”的方法;我想我不应该将我的活动设置为:android:configChanges=“keyboardHidden”方向“是的!对于第二条评论,我的意思是:如果您通过覆盖OnConfiguration Changed为横向模式和potrait模式提供替代的可绘制资源,那么您必须手动分配此替代资源。您可以从最新的newConfig参数中选择正确的指针。对于RelativeLayout问题,您是否尝试使其无效?“对于RelativeLayout问题,您是否尝试使其无效?”您这么说是什么意思?请不要发布在特定期限内过期的链接。谢谢您的建议。我读了你举的例子。因此,在我看来,使用onRetainonConfiguration Instance()实际上会杀死活动并重新启动它,但它提供了一种缓存加载的任何数据的方法。这很好,但是您仍然需要承担重新启动活动和重新加载所有视图的成本。。。但我想这正是必须做到的:)因此,如果使用onRetainonConfiguration实例(),我想我不应该将我的活动设置为:android:configChanges=“keyboardHidden | orientation”。