通过旋转方向更改布局而无需重新加载OnCreate()

时间:2015-05-27 15:55:07

标签: android xamarin mono orientation

我在不同的文件夹中有3个布局:

1. layout / HomeLayout.axml (其中 layout 是布局的文件夹,HomeLayout.axml是全局的axml文件)。
2. layout-large-port / HomeLayout.amxl (其中 layout-large-port 是一个大型(显示维度)肖像的文件夹,HomeLayout.axml是axml文件)。
3. layout-large-land / HomeLayout.axml (其中 layout-large-land 是一个大型(展示维度)景观的文件夹,HomeLayout.axml是axml文件)。

在此活动中,我将ListView包含一些数据,当我将手机从 人像 转到 风景 ,我需要保存我在纵向模式下的所有内容(listview上的每个内容都有不同的内容,如按钮 / textview 等)并显示在风景

那么现在做了什么。在HomeActivity上我声明了这个:

ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation

此代码段运行良好,但问题很严重:轮换后(从纵向横向)仍然是布局纵向。我该如何解决这个问题?

此外,我尝试覆盖方法OnConfigurationChanged

 public override void OnConfigurationChanged(Android.Content.Res.Configuration newConfig)
        {
            base.OnConfigurationChanged (newConfig);

            if(newConfig.Orientation == Android.Content.Res.Orientation.Landscape)
                {
                   SetContentView(Resource.Layout.ProductsLayout); //system understand that now is Landscape and put correct layout;  
                }
            else
                {
                    SetContentView(Resource.Layout.ProductsLayout); //same here
                }  

所以这种方法对我没有帮助,因为当我正在旋转手机时,布局设置正确但没有数据(listview为空),之后,当我试图从返回时横向纵向,布局设置正确但列表为空 有什么建议吗?

PS抱歉我的英文!

2 个答案:

答案 0 :(得分:0)

Android会在配置发生变化时完全破坏并重新创建您的活动;该活动中的所有视图及其保存的数据也将被丢弃。

来自Android docs

  

警告:您的活动每次都会被销毁并重新创建   用户旋转屏幕。当屏幕改变方向时,   系统会破坏并重新创建前台活动,因为   屏幕配置已更改,您的活动可能需要加载   替代资源(例如布局)。

在配置更改之间保持数据的标准机制是使用Activity的{​​{3}}回调保存视图数据,然后使用OnCreate回调提供的包恢复数据

这是如何操作的一个粗略示例:

public class MainActivity : Activity
{
    public const string ARG_LIST_STATE = "list_state";
    ListView _listView;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        SetContentView (Resource.Layout.Main);

        if (bundle != null) {
            // Existing data to restore!
            if (bundle.ContainsKey (ARG_LIST_STATE)) {
                var listState = bundle.GetStringArray (ARG_LIST_STATE);
                // TODO: Restore state into list view.
            }
        }
    }

    protected override void OnSaveInstanceState (Bundle outState)
    {
        string[] listState= new string[5]; // TODO: Grab data from the list view and serialize it into the outState
        outState.PutStringArray(ARG_LIST_STATE, listState);

        base.OnSaveInstanceState (outState);
    }
}

另一个例子是Xamarin OnSaveInstanceState提供的。

我强烈建议您查看here,以便更好地了解Android如何管理活动。

答案 1 :(得分:0)

解决方案是(对我来说)为肖像制作可接受的设计,它没有不同的横向模式(只使用 sum_weight 等机制)。