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

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


当前回答

您可以使用此代码锁定屏幕的当前方向。。。

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

其他回答

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

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

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

有很多方法可以做到这一点:

在创建时使用标志在清单文件中添加以下行


> android:screenOrientation=“纵向”


在onCreate()中


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

使用onConfigurationChanged()方法


在清单文件中,为Android 3.2及更高版本添加以下行/

     


android:configChanges="keyboardHidden|orientation" / android:configChanges="keyboardHidden|orientation|screenSize"

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

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portrait mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

使用onSaveInstanceState()@覆盖public void onSaveInstanceState(捆绑outState){/在此处保存要还原的数据示例:outState.putLong(“time_state”,time),时间是一个长变量/super.onSaveInstanceState(outState);}

和恢复

@覆盖protected void onCreate(捆绑savedInstanceState){super.onCreate(savedInstanceState);

if(savedInstanceState!= null){
   /*When rotation occurs
    Example : time = savedInstanceState.getLong("time_state", 0); */
} else {
  //When onCreate is called for the first time
}

}

我刚刚发现了这个传说:

为了通过方向更改保持活动活动,并通过onConfigurationChanged处理活动,上面的文档和代码示例在Manifest文件中建议:

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

这有一个额外的好处,那就是它总是有效的。

另一个好处是,省略keyboardHidden可能看起来合乎逻辑,但它会导致模拟器失败(至少对于Android 2.1):只指定方向会使模拟器有时同时调用OnCreate和onConfigurationChanged,而其他时候只调用OnCreate。

我还没有看到设备出现故障,但我听说过其他设备的仿真器出现故障。因此值得记录。