1

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

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

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

如果您知道如何执行两者之一(摆脱 API 12 中的“设置”按钮,或防止在 API 14 中更改方向后重新加载活动),我将非常感谢您的帮助。

4

3 回答 3

2

好的...终于我解决了!:) 保存活动状态而不是阻止活动重新加载,乍一看似乎有点棘手,但实际上非常简单,它是此类情况的最佳解决方案。就我而言,我有一个 ListView,它从 Internet 中填充项目,存储在自定义列表适配器中。如果更改了设备方向,则重新加载了活动,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;

附言

你不必完全按照我在这里展示的那样实现。在这段代码中,我保存了很多变量,并在OnCreate方法中创建了所有例程——这是错误的。我这样做只是为了展示它是如何实现的。

于 2013-08-12T21:23:43.447 回答
2

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

Android restart activityonDestroy()被调用,后面跟着onCreate(),可以区分onDestroy()call to kill activity 或者 restart app throw old answer

防止 Activity 重启

只需将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;


        }

       .....

}

希望这有帮助

于 2016-08-15T22:20:40.653 回答
0

在 API 13 以上,您需要在 ConfigChanges 中包含 screensize。

如此处所述。

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

于 2013-08-11T17:53:38.230 回答