防止在xamarin,monodroid中旋转后重新加载活动

本文关键字:新加载 加载 活动 旋转 xamarin monodroid | 更新日期: 2023-09-27 18:27:19

好的。。。所以我的问题是防止在方向改变后从活动重新加载。基本上,我所做的是:

[Activity(Label = "migs", ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation)]

这很好,直到我把"目标API"改为14。如果我把它改回12,那么一切都正常,但在14上,活动正在重新启动(OnCreate方法在旋转后启动)。所以…你会问我为什么需要"目标API"14?-容易的因为在我的应用程序中,我正在播放视频,为此我需要"真正的全屏"。所有API 14以下添加"设置"(三点)按钮。以HTC为例,它又大又丑,我无法摆脱。

如果你知道如何做这两件事中的一件(去掉API 12中的"设置"按钮,或者在API 14中改变方向后阻止活动重新加载),我将非常感谢你的帮助。

防止在xamarin,monodroid中旋转后重新加载活动

好的。。。我终于解决了!:)保存活动状态而不是阻止活动重新加载,乍一看可能有点棘手,但事实上确实很容易,这是此类情况的最佳解决方案。在我的例子中,我有一个ListView,它从互联网上填充项目,存储在自定义列表适配器中。如果设备方向发生了更改,则会重新加载活动,ListView也是如此,并且我丢失了所有数据。我所需要做的就是重写OnRetainNonConfigurationInstance方法。以下是如何做到这一点的快速示例。
首先,我们需要一个能够处理我们所有事情的类

以下是我们需要保存的所有东西的包装:

public class MainListAdapterWrapper : Java.Lang.Object
{
    public Android.Widget.IListAdapter Adapter { get; set; }
    public int Position { get; set; }
    public List<YourObject> Items { get; set; }
}

在我们的活动中,我们需要保存变量,以存储所有数据:

ListView _listView; //Our ListView
List<YourObject> _yourObjectList; //Our items collection
MainListAdapterWrapper _listBackup; //The instance of the saving state wrapper
MainListAdapter _mListAdapter; //Adapter itself

然后,我们覆盖活动中的OnRetainNonConfigurationInstance方法:

public override Java.Lang.Object OnRetainNonConfigurationInstance()
{
    base.OnRetainNonConfigurationInstance();
    var adapterWrapper = new MainListAdapterWrapper();
    adapterWrapper.Position = this._mListAdapter.CurrentPosition; //I'll explain later from where this came from
    adapterWrapper.Adapter = this._listView.Adapter;
    adapterWrapper.Items = this._yourObjectList;
    return adapterWrapper;
}

最后一个阶段是在OnCreate方法中加载保存状态:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.list);
    this._listView = FindViewById<ListView>(Resource.Id.listView);
    if (LastNonConfigurationInstance != null)
    {
        this._listBackup = LastNonConfigurationInstance as MainListAdapterWrapper;
        this._yourObjectList = this._listBackup.Items;
        this._mListAdapter = this._listBackup.Adapter as MainListAdapter;
        this._listView.Adapter = this._mListAdapter;
        //Scrolling to the last position
        if(this._listBackup.Position > 0)
            this._listView.SetSelection(this._listBackup.Position);
    }
    else
    {
        this._listBackup = new MainListAdapterWrapper();
        //Here is the regular loading routine
    }
}

关于this._mListAdapter.CurrentPosition。。。在我的MainListAdapter中,我添加了以下属性:

public int CurrentPosition { get; set; }

在"GetView"方法中,我做到了:

this.CurrentPosition = position - 2;

P.S

你不必像我在这里展示的那样实现。在这段代码中,我持有很多变量,并在OnCreate方法中生成所有例程——这是错误的。我这么做只是为了展示它是如何实现的。

方向改变时会发生什么(考虑在手机中启用旋转)?

调用安卓重启活动onDestroy(),然后调用onCreate(),可以区分onDestroy()调用终止活动还是重启应用抛出旧答案。

阻止活动重新启动

只需将ConfigurationChanges设置为OrientationScreenSize

[Activity (Label = "CodeLayoutActivity", ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)]

为什么这可能不起作用

我认为这不会起作用,但将RetaintInstance设置为true阅读更多关于RetainInstance 的信息

class myFragment: Fragment
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            this.RetainInstance = true;
          // this to change screen orientation 
            Activity.RequestedOrientation = ScreenOrientation.Landscape;

        }
       .....
}

希望这能帮助

在API 13之上,您需要在ConfigChanges中包含屏幕大小。

如这里所示。

也许将该标签添加到API13+的活动中会有所帮助?