Fragment already active错误出现的原因:当点击切换fragment时,由于上一个fragment1还没有结束(隐藏),下一个fragment2还没有开始就使用setArguments开始由activity向fragment2传递数据,因而就会产生Fragment already active的错误。
网上搜寻了好多办法,但大部分博客都是千篇一律扒的这个: https://blog.csdn.net/u011730649/article/details/43227721 说什么可以使用setter和getter Fragment的属性方法进行数据的存储和获取。而且没有给出任何的解决代码。我想知道,在说使用setter和getter Fragment的属性方法进行数据的存储和获取可以解决Fragment already active问题的人,你们真的亲身测试过解决这个问题么?而且假设使用这个办法好用,那么官网给出的“activity与fragment数据传递推荐使用setArguments进行传值“这句话是摆设呀。
下面我来说一下我在实际中的解决办法:
正常切换fragment的流程是:
Fragment1 fragment1=new Fragment1(); Fragment2 fragment2=new Fragment2(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction();// 创建一个事务 /* * 隐藏所有的Fragment(即结束fragment1) */ if (fragment1 != null) { transaction.hide(fragment1); } if (fragment2 != null) { ransaction.hide(fragment2); } /* *显示fragment2 */ transaction.show(fragment2); transaction.commit();// 提交事务
如上述代码所述:我们可以在第一个fragment(fragment1)被隐藏后,第二个fragment(fragment2)显示以后使用setArguments由activity向fragment2传递数据。具体代码如下:
Fragment1 fragment1=new Fragment1(); Fragment2 fragment2=new Fragment2(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction();// 创建一个事务 /* * 隐藏所有的Fragment(即结束fragment1) */ if (fragment1 != null) { transaction.hide(fragment1); } if (fragment2 != null) { ransaction.hide(fragment2); } /* *显示fragment2 */ transaction.show(fragment2); if(fragment2!=null) { Bundle bundle = new Bundle(); bundle.putString("你要传值的key", 你要传的值); fragment2.setArguments(bundle); } transaction.commit();// 提交事务
这样Fragment already active的问题就妥妥的解决了。