在不重新创建的情况下切换备选布局 activity

Change between alternative layouts without recreating activity

最初我的 activity 有一个布局,并使用以下属性来避免重新创建 activity 并因此在屏幕旋转时向数据库发送新请求:

ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize

后来我决定为横向模式使用另一种布局。问题是由于上述属性,我的应用程序从未切换到该替代布局。所以,我删除了它们,它开始在 landspace/portrait 布局之间切换,但现在我面临着同样的问题,即 activity 在每次重新创建时向数据库发送一个新请求。

如何使用替代布局并避免重新创建 activity?

    protected override void OnCreate(Bundle savedInstanceState)
            {
                AllLinesFromBatch = new List<WhseActivLine>();
                Orders = new List<WhseActivHeader>();

                base.OnCreate(savedInstanceState);
                SetContentView(Resource.Layout.NextOrder);

                var backBtn = FindViewById<Button>(Resource.Id.buttonBack);
                backBtn.Click += BackBtn_Click;

                var startBtn = FindViewById<Button>(Resource.Id.buttonStart);
                startBtn.Enabled = false;
                startBtn.Click += StartBtn_Click;

                notificationsArea = FindViewById<TextView>(Resource.Id.notificationsNextorder);
                notificationsArea.Text = string.Empty;

                var dsHeaders = Utility.WsHueckmann.GetDataWhseActivHeaders(PickActivity.CheckedZonesList.ToArray(), LoginActivity.User);

....other code.....
            }

在上面的代码中

var dsHeaders = Utility.WsHueckmann.GetDataWhseActivHeaders(PickActivity.CheckedZonesList.ToArray(), LoginActivity.User)

是调用数据库的地方。

如果问题只是数据库请求,我认为最简单的方法是创建一个应用程序全局变量,然后在 activity 中执行类似的操作:

if (globalDsHeaders == null){
var dsHeaders = Utility.WsHueckmann.GetDataWhseActivHeaders(PickActivity.CheckedZonesList.ToArray(), LoginActivity.User)
globalDsHeaders = dsHeaders
}
else {
dsHeaders = globalDsHeader
}
....

让我知道这是否有帮助。

我无法全面了解您要执行的操作,但我认为您应该按照 here

所述覆盖启动器 activity 的 onConfigurationChanged

Here你可以找到答案,如何针对不同的屏幕方向使用不同的资源