【问题标题】:Activity restarts my game on screen rotation (Android)活动在屏幕旋转时重新启动我的游戏(Android)
【发布时间】:2012-07-16 13:13:14
【问题描述】:

我知道这个问题已经被问过了,但我的问题有点不同:

我的游戏有 2 个不同的布局文件;一种用于纵向模式,一种用于横向模式。当我旋转屏幕时,onCreate 方法会重新启动我的游戏(再次创建所有元素)。我不希望这种情况发生,所以我在清单中写了这一行:

android:configChanges="orientation"

它可以工作,onCreate 没有被调用,但是新布局没有正确显示!

我试图将以下代码放入我的 Activity 中,但它总是在做一些奇怪的事情:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.gameview);
}

我该如何解决这个问题? 谢谢大家

【问题讨论】:

  • 更改屏幕模式时需要保存和恢复值。 [见这里][1] [1]:stackoverflow.com/questions/151777/…
  • 谢谢,但我无法将我创建的所有东西都保存在一个包中...我有几个对象和东西。每次有人旋转屏幕时都必须重新创建所有内容??
  • 你可以把这些东西放在你的应用程序对象中,然后从你的活动中访问它们

标签: android layout orientation oncreate


【解决方案1】:

首先了解android中方向变化的工作原理:

  1. 默认情况下,活动在方向更改事件时重新启动(并抛出 onCreate)。

  2. 如果您在清单中写android:configChanges="orientation" - 这意味着它不会被重新创建,而只是重新测量并重新绘制视图树。

对您的代码的评论:

  • 如果您对不同的方向有不同的布局 - 您必须在方向改变时重新创建活动。
  • 方法 setContentView 应该在每个活动生命周期中只调用一次。

处理这种情况的一般方法是:

  1. 在方法onSaveInstanceState中保存游戏状态
  2. 如果提供了onCreate 方法,则恢复游戏状态(savedInstanceState 参数不为空)。
  3. 从清单中删除配置更改的侦听。

【讨论】:

    【解决方案2】:

    您应该对任何对象使用 onRetainNonConfigurationInstance() 保存状态和恢复状态 getLastNonConfigurationInstance()。或者在 manifest 中硬编码设置 android:screenOrientation="portrait/landscape"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多