Android 如何恢复片段的savedInstanceState?
我可以按如下方式保存outState,但当我第二次登陆AttendanceFragment.cs时无法恢复Android 如何恢复片段的savedInstanceState?,android,android-fragments,xamarin,xamarin.android,Android,Android Fragments,Xamarin,Xamarin.android,我可以按如下方式保存outState,但当我第二次登陆AttendanceFragment.cs时无法恢复 public override void OnSaveInstanceState(Bundle outState) { base.OnSaveInstanceState(outState); dataGotFromServer = JsonConvert.SerializeObject(dataList); outState.Put
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()和oncreate(),但恢复失败
我的片段替换代码如下
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
在这种情况下,您正在使用片段交换片段。参数
是一个选项,而不是单例/静态变量
回复:
在使用参数时:
参数
OnPause
override中,更新参数/包
使用您需要保存的项目李>
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
调用中指定了标记
:
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");
};
注意:在托管活动被回收的情况下,您仍然需要处理其他片段生命周期事件:
ReplaceFragment
的方式吗?您希望它什么时候恢复?请描述用户做了什么,您期望发生什么,以及发生了什么?我有一个名为Attention Navigation Drawer的菜单选项,它的单击事件在活动中维护,然后用户登陆此片段。所以,第一次调用Web是可以的如果用户单击此选项,我希望恢复数据,而不是再次调用webserver。@我已编辑代码供您参考。