如何恢复片段的savedInstanceState?

时间:2017-08-17 04:00:29

标签: android android-fragments xamarin xamarin.android

我可以按如下方式保存outState,但是当我第二次登陆 AttendanceFragment.cs 时无法恢复。

 public override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);
        dataGotFromServer = JsonConvert.SerializeObject(dataList);
        outState.PutString(KEY_OUTSTATE, dataGotFromServer);
    }

我在这里尝试恢复但无法得到它

 public override void OnViewStateRestored(Bundle savedInstanceState)
    {
        base.OnViewStateRestored(savedInstanceState);
        if(savedInstanceState!=null)
        {
            var result = savedInstanceState.GetString(KEY_OUTSTATE, dataGotFromServer);
        }

    }

我还尝试了 CreateView(),OnActivityCreated()和On Create() ,但还原失败。

我的片段替换代码是

 public void ReplaceFragment(Context context, Fragment newFragment, string TAG)
    {
        Android.Support.V4.App.FragmentManager fragmentManager = ((FragmentActivity)context).SupportFragmentManager;
        Android.Support.V4.App.FragmentTransaction ft = fragmentManager.BeginTransaction();
        ft.Replace(Resource.Id.HomeFrameLayout, newFragment);
        ft.AddToBackStack(TAG);
        ft.Commit();

    }

编辑: 这就是我称之为片段的方式

 case (Resource.Id.nav_attendance):


                var role = session.GetUserDetails().Get(SessionManagement.KEY_ROLE).ToString();
                if (role=="Student")
                {
                    Fragment attendanceTabFragment = new AttendanceTabFragment();
                    customFragment.ReplaceFragment(this, attendanceTabFragment,typeof(AttendanceTabFragment).Name);
                }else
                {
                    Fragment attendanceFragment = new AttendanceFragment();
                    customFragment.ReplaceFragment(this, attendanceFragment, typeof(AttendanceFragment).Name);
                }

任何想法或示例代码非常感谢。 谢谢。

1 个答案:

答案 0 :(得分:1)

除非包含片段的活动被处理掉,否则不会调用片段OnSaveInstanceState

在某种情况下,您是要进出交换碎片,使用 Fragment.Arguments 是一个选项,而不是单例/静态变量......

重新:getArguments / setArguments

使用参数:

  1. 在Fragment构造函数中创建一个新的Bundle并将其分配给 Arguments
  2. OnPause覆盖更新Arguments / Bundle 与您需要保存的项目。
  3. OnResume覆盖中阅读 您需要还原的参数/捆绑项。
  4. 示例片段:

    public class Fragment1 : Fragment
    {
        public Fragment1(System.IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
        {
            CreateArgumentBundle();
        }
    
        public Fragment1()
        {
            CreateArgumentBundle();
        }
    
        void CreateArgumentBundle()
        {
            Arguments = new Bundle();
        }
    
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            return inflater.Inflate(Resource.Layout.Frag1, container, false);
        }
    
        public override void OnPause()
        {
            base.OnPause();
            Arguments.PutString("someKey", "StackOverflow");
        }
    
        public override void OnResume()
        {
            base.OnResume();
            var someKeyString = Arguments.GetString("someKey", "someDefaultString(new bundle)");
            Log.Debug("SO", someKeyString);
        }
    }
    

    ReplaceFragment中,确保您在TAG来电中指定Replace

    public void ReplaceFragment(Context context, Fragment newFragment, string TAG)
    {
        SupportFragmentManager
            .BeginTransaction()
            .Replace(Resource.Id.fragmentContainer, newFragment, TAG)
            .AddToBackStack(TAG)
            .Commit();
    }
    

    在调用ReplaceFragment之前,在创建一个新片段之前检查片段是否存在(FindFragmentByTag),此示例只是交换两个片段进出,如果管理器确实存在,则只创建新片段不包含一个:

    button.Click += delegate
    {
        toggle = !toggle;
        var frag = SupportFragmentManager.FindFragmentByTag(toggle ? "frag1" : "frag2");
        frag = frag ?? ( toggle ? (Fragment)new Fragment1() : (Fragment)new Fragment2() );
        ReplaceFragment(this, frag, toggle ? "frag1" : "frag2");
    };
    

    注意:在托管活动被回收的情况下,您仍需要处理其他Fragment生命周期事件: