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

时间:2013-08-11 16:43:14

标签: c# android android-activity xamarin.android xamarin

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

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

这很好,直到我将“Target API”更改为14.如果我将其更改回12,那么一切正常,但在14,活动正在重新启动(OnCreate方法在轮换后触发)。 那么......你会问为什么我需要“Target API”14? - 简单!因为在我的应用程序中,我正在播放视频,为此我需要“真正的全屏”。所有API都在14以下添加“设置”(三个点)按钮。在HTC的情况下,它是一个大而丑陋的按钮,我无法摆脱它。

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

2 个答案:

答案 0 :(得分:2)

好的......最后我解决了! :) 保存活动状态而不是阻止重载活动,从一开始就看起来有点棘手,但事实上它真的很简单,对于像这样的情况来说它是最好的解决方案。 在我的例子中,我有一个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方法中制作所有例程 - 这是错误的。我这样做了,只是为了说明如何实现它。

答案 1 :(得分:0)

在API 13之上,您需要在ConfigChanges中包含screenize。

As denoted here.

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