如何恢复保存的实例片段的状态?



我能够按如下方式保存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);
}

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

除非包含片段的活动被释放,否则不会调用片段的OnSaveInstanceState

在将片段换入和换出的情况下,使用Fragment.Arguments是一种选择,而不是单例/静态变量...

re: getArguments/setArguments

使用参数时:

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

示例片段:

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请确保在Replace调用中分配TAG

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");
};

注意:如果托管活动被回收,您仍需要处理其他片段生命周期事件:

  • 片段生命周期

最新更新