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

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


当前回答

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

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

class MyViewModel : ViewModel() {

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

其他回答

您还可以考虑使用Android平台的跨方向更改持久化数据的方式:onRetainNonConfigurationInstance()和getLastNonConfigurationInstance)。

这允许您在配置更改中保存数据,例如您可能从服务器获取的信息或在onCreate中或之后计算的其他信息,同时还允许Android使用xml文件重新布局“活动”,以适应当前使用的方向。

请看这里或这里。

应该注意的是,这些方法现在已经被弃用(尽管比上面大多数解决方案所建议的自己处理方向改变更灵活),建议每个人都切换到Fragments,而不是在每个想要保留的Fragment上使用setRetainInstance(true)。

您所描述的是默认行为。您必须通过添加以下内容自行检测和处理这些事件:

android:configChanges

然后是您想要处理的更改。因此,对于方向,您可以使用:

android:configChanges="orientation"

对于正在打开或关闭的键盘,您可以使用:

android:configChanges="keyboardHidden"

如果要同时处理这两种情况,只需使用pipe命令将它们分开,如:

android:configChanges="keyboardHidden|orientation"

这将在您调用的任何Activity中触发onConfigurationChanged方法。如果重写该方法,则可以传入新值。

希望这有帮助。

与其试图阻止onCreate()被完全激发,不如尝试检查传递到事件中的Bundle savedInstanceState,看看它是否为null。

例如,如果我有一些逻辑应该在真正创建“活动”时运行,而不是在每次方向更改时运行,那么只有当savedInstanceState为空时,我才在onCreate()中运行该逻辑。

否则,我仍然希望布局按照方向正确重新绘制。

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

不确定这是否是最终答案,但这对我来说是有效的。

将此行添加到清单中:-

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"

将此代码段添加到活动:-

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

注意:如果将来有人和我面临同样的问题,我会发布这个答案。对我来说,下面这行是不够的:

android:configChanges="orientation"

当我旋转屏幕时,没有调用方法`onConfigurationChanged(配置新配置)。

解决方案:即使问题与方向有关,我也必须添加“screenSize”。因此,在AndroidManifest.xml文件中,添加以下内容:

android:configChanges="keyboardHidden|orientation|screenSize"

然后实现方法onConfigurationChanged(Configuration newConfig)