簡體   English   中英

如何恢復fragmentInstanceState的片段?

[英]How to restore savedInstanceState of fragment?

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

任何想法或示例代碼非常感謝。 謝謝。

除非處理包含Fragment的Activity,否則將不會調用Fragment的OnSaveInstanceState

在一種情況下,您使用Fragment.Arguments是一個選項而不是單例/靜態變量來交換片段進出。

回復getArguments / setArguments

在使用參數時:

  1. 在Fragment構造函數中創建一個新Bundle並將其分配給Arguments
  2. OnPause替代中,使用您需要保存的項目更新Arguments / Bundle。
  3. OnResume替代中,讀取您需要還原的Arguments / Bundle項目。

片段示例:

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

注意:在回收托管活動的情況下,您仍然需要處理其他Fragment生命周期事件:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM