FragmentTransaction 之 **Java.Lang.IllegalStateException:** 'commit already called'

今天写一个离奇的Xamarin Android的Bug , 是在使用Fragment的时候出现的, 有这么一个需求:

 

FragmentTransaction 之 **Java.Lang.IllegalStateException:** 'commit already called'_第1张图片

要求用Fragement去实现 , 当点击Btn的时候,对应切换下面显示的Fragment。原生Android的小伙伴肯定以为太简单了,直接就可以写出以下的代码,在此省略对应Fragment创建的代码 。

    public class MainActivity : AppCompatActivity
    {
        Android.Support.V4.App.Fragment fragmentOne;
        Android.Support.V4.App.Fragment fragmentTwo;
        Android.Support.V4.App.FragmentTransaction fragmentManager;
        [Obsolete]
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            Button buttonone = FindViewById

没毛病,于是就开始运行了,结果报错了 。

**Java.Lang.IllegalStateException:** 'commit already called'

于是,你会觉得是不是不用加

fragmentManager.Commit();

但是,运行完又没有效果。

这个时候,我去看了下Google的文档对于FragmentTransaction的定义。什么发现也没有。然后,我又看了beginTransaction的文档,找到了下面的解释。

Note: A fragment transaction can only be created/committed prior to an activity saving its state. If you try to commit a transaction after Activity#onSaveInstanceState (and prior to a following Activity#onStart or Activity#onResume, you will get an error. This is because the framework takes care of saving your current fragments in the state, and if changes are made after the state is saved then they will be lost.

想了下,可能是FragmentTransaction可能不够持久, 在OInCreate之后就已经失效了,它记录的只是一个短暂的碎片状态。于是在Btn的点击事件里修改了一下:

private void Buttonone_Click(object sender, System.EventArgs e)
{
    //throw new System.NotImplementedException();
    Console.WriteLine("Buttonone_Click");
    fragmentManager = SupportFragmentManager.BeginTransaction();

    fragmentManager.Replace(Resource.Id.containerView, fragmentOne);
    fragmentManager.Commit();
}

private void Buttontwo_Click(object sender, System.EventArgs e)
{
    //throw new System.NotImplementedException();
    Console.WriteLine("Buttontwo_Click");

    fragmentManager = SupportFragmentManager.BeginTransaction();

    fragmentManager.Replace(Resource.Id.containerView, fragmentTwo);
    fragmentManager.Commit();
}

果然可以了。

FragmentTransaction 之 **Java.Lang.IllegalStateException:** 'commit already called'_第2张图片

备注 :Xamarin Android的 Fragment 的官方参考文档。

 

你可能感兴趣的:(Android开发)