这个问题困扰了好久,还是好好看看别人博客才算是理解了博客知识点:https://blog.csdn.net/freelander_j/article/details/52925745
必须理解commitAllowingStateLoss() 和commit()的区别,其实这个错只是Android api 错误的一个提示,是使用这个两者应用场景出现的bug,都是事务提交,commit只能在Activity的onSaveInstatnceState之前调用,反之commitAllowingStateLoss()(允许在状态缺失的情况下提交事务)可以在onSaveInstatnceState之后调用:
1.使用FragmentPagerAdapter 就会遇到这个坑
public class MyViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragments = new ArrayList<>();//添加的Fragment的集合 private final List<String> mFragmentsTitles = new ArrayList<>();//每个Fragment对应的title的集合 private FragmentManager fm; public MyViewPagerAdapter(FragmentManager fm) { super(fm); this.fm = fm; } /** * @param fragment 添加Fragment * @param fragmentTitle Fragment的标题,即TabLayout中对应Tab的标题 */ public void addFragment(Fragment fragment, String fragmentTitle) { mFragments.add(fragment); mFragmentsTitles.add(fragmentTitle); } @Override public Fragment getItem(int position) { //得到对应position的Fragment Fragment fragment = null; fragment = mFragments.get(position); Bundle bundle = new Bundle(); bundle.putString("id", "" + position); bundle.putString("flag", "" + position); fragment.setArguments(bundle); return fragment; } @Override public Fragment instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); fm.beginTransaction().show(fragment).commitAllowingStateLoss(); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { // super.destroyItem(container, position, object); Fragment fragment = mFragments.get(position); fm.beginTransaction().hide(fragment).commitAllowingStateLoss(); } @Override public int getCount() { //返回Fragment的数量 return mFragments.size(); } @Override public CharSequence getPageTitle(int position) { //得到对应position的Fragment的title return mFragmentsTitles.get(position); } }
instantiateItem和destroyItem中提交事务尽量使用commitAllowingStateLoss
2.commitAllowingStateLoss 是重新构建code reView 不建议使用,如果有解决方法;