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

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

 

要求用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<Button>(Resource.Id.buttonone);
            buttonone.Click += Buttonone_Click;

            Button buttontwo = FindViewById<Button>(Resource.Id.buttontwo);
            buttontwo.Click += Buttontwo_Click;
            fragmentOne = new Fragment1();
            fragmentTwo = new Fragment2();

            //fragmentManager = FragmentManager.BeginTransaction();
            fragmentManager = SupportFragmentManager.BeginTransaction();
            fragmentManager.Add(Resource.Id.containerView, fragmentOne);
            fragmentManager.Commit();
        }

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

            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.Replace(Resource.Id.containerView, fragmentTwo);
            fragmentManager.Commit();
        }

    }

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

**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();
}

果然可以了。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值