在我的Android应用程序中,当我旋转设备(滑出键盘)时,“活动”将重新启动(调用onCreate)。现在,这可能是应该的,但我在onCreate方法中做了很多初始设置,所以我需要:

将所有初始设置放在另一个功能中,这样不会在设备旋转或使其不再调用Create,布局仅调整或将应用程序限制为仅肖像,以便不调用onCreate。


当前回答

我只是简单地补充了一句:

android:configChanges="keyboard|keyboardHidden|orientation"

在AndroidManifest.xml文件中,并且没有在我的活动中添加任何onConfigurationChanged方法。

所以,每当键盘滑出或滑入时,什么都不会发生!也可以查看这篇关于这个问题的文章。

其他回答

onConfigurationChanged is called when the screen rotates. 
(onCreate is no longer called when the screen rotates due to manifest, see:  
android:configChanges)

清单的哪个部分告诉它“不要调用onCreate()”?

而且谷歌的文档说要避免使用android:configChanges(除非作为最后手段)。但是,他们建议的替代方法都使用android:configChanges。

根据我的经验,模拟器总是在旋转时调用onCreate()。但我运行相同代码的1-2台设备……没有。(不知道为什么会有什么不同。)

使用应用程序类

根据您在初始化中所做的操作,您可以考虑创建一个扩展Application的新类,并将初始化代码移动到该类中的重写onCreate方法中。

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

应用程序类中的onCreate仅在创建整个应用程序时调用,因此“活动”在方向或键盘可见性更改时重新启动不会触发它。

最好将这个类的实例公开为一个单例,并使用getter和setter公开正在初始化的应用程序变量。

注意:您需要在清单中指定要注册和使用的新Application类的名称:

<application
    android:name="com.you.yourapp.MyApplicationClass"

对配置更改作出反应[UPDATE:自API 13以来,这已被弃用;请参阅推荐的替代方案]

作为另一种选择,您可以让应用程序监听可能导致重新启动的事件(如方向和键盘可见性更改),并在“活动”中处理这些事件。

首先将android:configChanges节点添加到“活动”的清单节点

 <activity android:name=".MyActivity"
      android:configChanges="orientation|keyboardHidden"
      android:label="@string/app_name">

或适用于Android 3.2(API级别13)及更高版本:

<activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize"
      android:label="@string/app_name">

然后在“活动”中重写onConfigurationChanged方法,并调用setContentView以强制以新方向重新完成GUI布局。

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

在清单中添加此行:android:configChanges=“orientation | screenSize”

将以下代码放在Android清单中的活动中。

android:configChanges="orientation"

当你改变方向时,这不会重新开始你的活动。

尽管这不是“Android方式”,但我自己处理方向变化,并简单地在视图中重新定位小部件,以将改变的方向考虑在内,从而获得了非常好的结果。这比任何其他方法都快,因为您的视图不必保存和恢复。它还为用户提供了更无缝的体验,因为重新定位的小部件是完全相同的小部件,只是移动和/或调整大小。不仅可以以这种方式保存模型状态,还可以保存视图状态。

RelativeLayout有时对于需要不时调整自身方向的视图来说是一个不错的选择。您只需为每个子控件提供一组纵向布局参数和一组景观布局参数,每个参数上有不同的相对定位规则。然后,在onConfigurationChanged()方法中,将适当的值传递给每个子级的setLayoutParams()调用。如果任何子控件本身需要在内部重新定向,只需调用该子控件上的方法来执行重新定向。该子控件类似地调用其任何需要内部重新定向的子控件上的方法,依此类推。