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

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


当前回答

要在Android清单中进行的更改包括:

android:configChanges="keyboardHidden|orientation" 

要在活动中添加的内容包括:

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

其他回答

修复AndroidManifest.xml中的屏幕方向(横向或纵向)

android:screenOrientation=“纵向”或android:scheenOrientation=“横向”

为此,不会调用onResume()方法。

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台设备……没有。(不知道为什么会有什么不同。)

谷歌推出的android架构中最好的组件之一将满足ViewModel的所有要求。

它旨在以生命周期的方式存储和管理与UI相关的数据,并允许数据在屏幕旋转时继续存在

class MyViewModel : ViewModel() {

请参阅:https://developer.android.com/topic/libraries/architecture/viewmodel

您可以在活动中使用ViewModel对象。

ViewModel对象在配置更改期间自动保留,以便它们所保存的数据可立即用于下一个活动或片段实例。阅读更多信息:https://developer.android.com/topic/libraries/architecture/viewmodel

使用应用程序类

根据您在初始化中所做的操作,您可以考虑创建一个扩展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);
}